本地时间在Android和Windows上为tm_hour / tm_isdst提供不同的结果

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

我在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日)不是在我的时区夏令时(格林尼治标准时间),但已经进入夏令时后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相同的问题。

我能find的本地时间的最清晰的定义似乎表明它应该像在Windows上一样工作:

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

tm_isdst在故障平台上也停留在0,但在Windows上发生更改,因为它应该如此。

一些明显的检查方式:

  • 时区:所有设备当前设置为相同的时区
  • 硬件时钟:他们看起来同步,但不应该因为我传递我自己的时间价值,零。 本地时间只需要您传入的时间值,DST规则和根据TZ的时区​​。