如何使用 MKtime 尊重时区
how to use mktime to respect timezone
如何在 Linux/gcc 中创建时区感知struct tm
?我有以下代码:
struct tm date;
date.tm_year=2012-1900;
date.tm_mon=9;
date.tm_mday=30;
date.tm_hour=17;
date.tm_min=45;
date.tm_sec=0;
date.tm_zone="America/New_York";
time_t t = mktime(&date);
当我打印t
时,值是1349045100
。所以我把它使用 c++ 和 python 打印为字符串,它返回我:Sun Sep 30 18:45:00 2012
这是一个小时的偏差。我想要17:45而不是18:45。我正在使用的python命令是:
time.ctime(1349045100)
我正在使用C++是:
::setenv("TZ", "America/New_York",1);
::tzset();
strftime(tm_str, len_tm_str, "%Y%m%d %H:%M:%S", ::localtime(&t));
所以当我构建时间时,它似乎已经偏离了一个小时。我该如何纠正?
您的问题几乎可以肯定是tm
结构的tm_isdst
标志默认为 0,这导致即使在夏天(您的日期是)也没有 DST。然后,当您转换回本地时间时,它确实添加了 DST 偏移量,从而导致您注意到的差异。
最简单且通常正确的解决方案是将tm_isdst
成员设置为 -1,mktime
确定相关日期是否应应用 DST 偏移量。
请注意,DST 是否有效与您使用的时区正交。两者都需要以正确的方式设置才能正确显示结果。
此外,如果您的应用程序有可能被线程化,请考虑使用 localtime_r
而不是 localtime
。
相关文章:
- Log4cpp:以UTC/GMT时区打印日期
- std::strftime 在 Windows 中使用 GMTIME 将时区 UTC 显示为 UTC+1
- 以线程安全的方式转换 C/C++ 中时区名称字符串的时区偏移量
- C++日期库因时区而失败
- C++:获取时区偏差
- MKTIME(&time_check) 仅返回"-1"
- 如何在不使用 std::tm 和 mktime() 的情况下为给定日历日期创建 chrono::time_point 对
- 如何在Arduino上将时间设置为中部时区?
- structtm是否将时区信息存储为其数据成员
- C++:将Unix时间转换为非本地时区
- 获取指定时区的日期和时间
- 如何以正确的时区从XTS索引中获取数字时间?
- C++中 mktime 的替代品
- 将带有时区的纪元时间转换为Excel格式的时间?
- 如何导致 std::mktime 失败
- std :: mkTime返回-1在qnx上
- 快速将带有时区的日期时间字符串转换为 UNIX 时间戳(C++)
- 使用C 在特定时区获取当前时间
- 如何使用 MKtime 尊重时区
- 澳大利亚时区的mktime错误