localtime在Android和Windows上为tm_hour / tm_isdst提供不同的结果

时间:2014-05-15 15:43:46

标签: android c windows datetime

我注意到本地时间似乎在不同的平台上给出了不同的结果,尽管我能找到的每个定义似乎都以相同的方式定义它。

我在Windows上运行以下代码:

struct tm *tm1;
time_t ltime = (time_t)0;
tm1=localtime(&ltime);

然后编辑,重新编译并运行以下内容:

struct tm *tm1;
time_t ltime = (time_t)60*60*24*30*6;
tm1=localtime(&ltime);

结果是相同的,除了大约6个月的差异,更重要的是以下几点:

tm1.tm_hour = 00000000 //epoch
tm1.tm_hour = 00000001 //epoch + 6 months

这是预期的,因为时代(1970年1月1日)不是我的时区(GMT)的夏令时,但它已经在6个月后进入夏令时。这表明Windows正确应用了DST规则。

然而,当我在Android上做同样的事情时,我得到:

tm1.tm_hour = 00000001 //epoch
tm1.tm_hour = 00000001 //epoch + 6 months

我不知道为什么结果不一致,这肯定​​就像它得到的一样简单!我唯一可以想象的是,不是应用DST规则,而是在当前时区,BST(GMT + 1)的时间点为epoch = 0。顺便提一下,我也在iOS,OSX和Linux上做过这个,它也显示出与Android相同的问题。

localtime I can find的最清晰定义似乎表明它应该像在Windows上一样工作:

  

如果应用程序使用localtime()来确定本地时间,则localtime()将确定是否适用夏令时(假设DST信息可用)并且将正确设置tm_isdst标志。

tm_isdst在故障平台上也停留在0,但在Windows上发生变化,应该如此。

一些明显的检查方式:

  • 时区:所有设备当前都设置为相同的时区
  • 硬件时钟:它们似乎已经同步,但它并不重要,因为我无论如何都要传递自己的时间值,为零。本地时间只需要 您传入的时间值,DST规则和时区 到TZ。

0 个答案:

没有答案