2010-07-16 54 views
3

我对函数stat()有严重的麻烦。我在cygwin下编译OND Windows 7和相同的应用程序与MSVC++编译在Windows 7的应用程序包含下面的代码的应用程序:C stat()和夏时制

struct stat stb; 
memset(&stb, 0, sizeof(stb)); 

stat(szPath, &stb); 

cout << hex << uppercase << setw(8) << stb.st_mtime << endl; 

szPath是一个文件的路径。该文件不会被应用程序以任何方式修改。问题是,我得到不同的结果一些文件。例如:

cygwin version: 40216D72 
MSVC++ version: 40217B82 

的差始终E10 = 3600 =1小时

通过使用谷歌,i found this,这似乎正好是我看到了同样的问题。有没有一种便携式的方式来解决这个问题?我无法使用任何WinAPI调用。最简单可靠的解决方案就是我所需要的,但如果它需要变得复杂,就这样吧。可靠性和可移植性(win + linux)是最重要的。

+2

这就是为什么你应该永远不会使用本地时间除了与用户交互之外的任何内容。 – 2010-07-16 12:34:23

+0

不幸的是,这是我不能改变的。我的任务是确保两个平台上的输出相同。 – PeterK 2010-07-16 13:12:20

回答

2

为了在这里获得可靠性和可移植性(或者在大多数情况下,这种情况下两个平台与“相同”代码做不同的事情),您可能需要使用某种形式的目标相关代码,像:

#ifdef _MSC_VER 
    // do MSVC++-specific code 
#else 
    // do Linux/Cygwin/generic code 
#endif 

那么你应该能够使用WinAPI的在_MSC_VER部分要求,因为那样只会当你使用编译MSVC++

+0

会尝试,尽管它不是我喜欢的解决方案。似乎认为不会有任何其他选择。 – PeterK 2010-07-18 08:39:12

1

显然每http://support.microsoft.com/kb/190315这实际上是一个功能,虽然它真的看起来像一个bug。他们说你可以通过在系统时钟的日期/时间属性对话框中清除“自动调整夏令时更改时钟”来解决这个问题。

如果您有文件的日期,您可以使用dst的相对状态来确定您是否需要仅在MSVC中自行进行一小时的调整,但这也同样困难。

0

不确定你正在使用的功能,但我知道Windows和Linux使用不同的系统时钟。 Windows将本地时间(包括DST)存储在系统时钟上。 Linux(至少传统上)在系统时钟上存储GMT(或准确的UTC)。如果这适用于cygwin,我不会。

如果一个linux系统与windows共享硬件,它需要配置为使用系统时钟(如Windows)或每次窗口调整DST时都会搞砸。