C stat()和夏令时

时间:2010-07-16 12:09:49

标签: c++ file time portability

我在功能stat()方面遇到了严重问题。我有一个在Windows 7下使用cygwin编译的应用程序,以及在Windows 7上使用MSVC ++编译的相同应用程序。该应用程序包含以下代码:

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)是最重要的事情。

3 个答案:

答案 0 :(得分:2)

为了在这里获得可靠性和可移植性(或者在大多数情况下,两个平台对应该是“相同”的代码执行不同的事情),您可能需要使用某种形式的依赖于目标的代码,例如:

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

然后您应该能够在_MSC_VER部分中使用WinAPI调用,因为只有在使用MSVC ++时才会编译它

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

如果linux系统与windows共享硬件,则需要将其配置为使用系统时钟(如windows)或每次窗口调整DST时搞乱。