【发布时间】:2017-12-17 23:23:33
【问题描述】:
我正在为您的 IAR 编译器使用 DLib,并希望将 UTC 时间戳转换为本地时间戳。
我位于德国,因此我对 __getzone 方法的实现如下:
char const * __getzone() {
return ":GMT+1:GMT+2:0100:(1980)032502+0:102503+0";
}
我写了一些测试代码:
time_t ts = 1509238797L;//29.10.2017-02:59:57 3 seconds before dst
struct tm* pre = localtime(&ts);
time_t after = ts + 5L;//wait 5 seconds -> 29.10.2017-02:00:02
struct tm* post = localtime(&after);
“pre”变量很好,但“post”变量包含值: 29.10.2017-03:00:02 但应该是 29.10.2017-02:00:02。
我在 Visual-Studio 中调试了代码,一切似乎都在那里工作。我错过了什么吗?
【问题讨论】:
-
您的
__getzone()应该返回:return ":GMT+1:GMT+2:0100:(1980)032502+0:092503+0";,因为德国的夏令时结束于 9 月而不是 1980 年 10 月。此外,这是对该功能的一个非常好的解释:stackoverflow.com/a/24640784/8051589。德国夏令时:Begin 1980 Sunday, 6. April 1980 2:00 CET | End: Sunday, 28. September 1980 3:00 CEST. -
错了。夏令时将于十月结束:timeanddate.com/time/change/germany/berlin?year=2017
-
1980 年是
Sunday, 6 April, 02:00 Sunday, 28 September, 03:00 -
是的,正如我所说...您的规则是在
__getzone()中适用于 1980 年,因此您必须采用我已经提到的返回值。然后它应该工作。请报告。 -
@AndreKampling 1980 年部分是可选的。您可以删除整个部分并获得: :GMT+1:GMT+2:0100:032502+0:102503+0 德国的夏令时仍然在十月的最后一个星期日结束,而不是在九月。如果您可以将浏览器区域设置更改为德语/德国,您可以试试这个站点:epochconverter.com 输入 1509238797 和 1509238802,这两个之间的持续时间是 5 秒。第一个是“Sunday, 29.10 2017 02:59:57 GMT+02:00 DST”,另一个是“Sunday, 29.10 2017 02:00:02 GMT+01:00” 这就是我期望的结果
标签: c iar mktime localtime time.h