【问题标题】:Converting UTC to local将 UTC 转换为本地
【发布时间】:2012-04-22 21:37:25
【问题描述】:

我的时区是美国东部标准时间,比 UTC 晚 5 小时。鉴于:

struct tm t = { 0, 30, 15, 10, 3, 112, 0, 0, -1 };
time_t utc_in_timet = _mkgmtime(&t);

struct tm tt = { 0 };
localtime_s(&tt, &utc_in_timet);

当 localtime_s 返回时,tt 关闭一小时。我那里是 11:30 而不是 10:30。

我错过了什么?

【问题讨论】:

    标签: c++ visual-c++ time utc


    【解决方案1】:

    我认为这与夏令时有关。您确定您当前的时区是 EST (-5) 吗?因为您的系统似乎应该使用 EDT (-4)?

    【讨论】:

    • 我的时区绝对设置为 EST。此外,即使一位同事在英国尝试过,此代码也会关闭一个小时。我相信它在 localtime_s 返回时返回 16:30(或 14:30 - 我不记得是哪个)
    • 好吧,我也试过这个:timeanddate.com/worldclock/converter.html 当我转换为 EST-New York 时,它会自动使用夏令时。我还为 EST 发出警告:Only some locations are currently on EST, because most places there are currently on Daylight Saving Time. 所以我真的认为您使用的时区是夏令时的 EST (=EDT)
    【解决方案2】:

    以为问题是月份是三月: struct tm t = { 0, 30, 15, 10, 3, 112, 0, 0, -1 }; 然后,这是夏令时问题。但正如 Gorpik 所指出的,“月份从 0 到 11,所以 4 月确实是 3”。

    所以,我检查了 - 它显示海法 18:30 是正确的 +2UTC。

    【讨论】:

    • 这是错误的。在tm 中,月份是从 0 到 11,所以 April 确实是 3
    • 是的,只是想删除帖子。但你打字速度更快。
    【解决方案3】:

    验证您的本地时区。英格兰(例如伦敦)和美国东海岸目前都处于夏令时,所以这看起来是问题所在(正如有人已经提到的那样)。对于美国东海岸 EDT,时间会有所不同。

    【讨论】:

      【解决方案4】:

      我已经在我的机器上尝试过你的代码,它工作正常(我的时区是 GMT+2)。由于您告诉系统自己检查夏令时(tm 的最后一个参数是 -1),它实际上使用的是 EDT,因此为您提供 GMT-4。

      您可以尝试将月份 (3) 替换为 2,以便日期为 3 月 10 日,就在夏令时更改之前;我敢打赌,在这种情况下,你会得到预期的 10:30。

      【讨论】:

      • 我也注意到了。将 tm_isdst 设置为 1 几乎会产生相同的效果,对吧?
      • 必须有一些通用的方法通过夏令时将UTC转换为当地时间,对吧?
      • 是的,在这种情况下,将tm_isdst 设置为1 会产生相同的效果。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-24
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-08
      相关资源
      最近更新 更多