如何解决让 mktime() 在 C++ 中忽略 DST 和本地时区
我们的系统从供应商处接收 ASCII 格式“20210715083015”的数据。此时间为美国东部时间,已根据夏令时进行调整。
自 Epoch 以来,我们的后端需要以纳秒为单位的这次时间。我正在尝试使用 mktime() 进行转换,但 mktime() 坚持为 DST 添加一个小时,即使我将 tm_isdst 强制为 0。
这是代码片段:
std::tm tmstr{};
<breakdown ASCII time into tm structure>
tmstr.tm_isdst = 0;
cout << "isdst before: " tmstr.tm_isdst;
time_t seconds = std::mktime(&tmstr);
cout << ",isdst after: " tmstr.tm_isdst << endl;
输出如下:
isdst before: 0,isdst after: 1
它忽略了 0 的设置值,并应用了自己的转换。
我如何使用 mktime() 或等效的东西,而不尝试将时间调整到我的时区?我宁愿不必在内部设置时区,我只是想让它从 tm 结构直接转换为秒。
这是 g++ 7.3.1 版,在 Redhat 6.10 版下。
解决方法
在这里发帖更容易...
从 mktime 手册页,您没有阅读所写的内容...
mktime() 函数将分解的时间结构(表示为本地时间)转换为日历时间表示。该函数会忽略调用者在 tm_wday 和 tm_yday 字段中提供的值。 tm_isdst 字段中指定的值通知 mktime() 对于 tm 结构中提供的时间,夏令时 (DST) 是否有效:正值表示 DST 有效;零表示 DST 无效;负值意味着 mktime() 应该(使用时区信息和系统数据库来)尝试确定 DST 是否在指定时间生效。
mktime() 函数修改 tm 结构的字段如下: tm_wday 和 tm_yday 被设置为由其他字段的内容确定的值;如果结构成员在其有效区间之外,则它们将被标准化(例如,将 40 October 更改为 9 November); tm_isdst 分别设置(不管其初始值如何)为正值或 0,以指示 DST 在指定时间是否有效。调用 mktime() 还会使用有关当前时区的信息设置外部变量 tzname。
,忽略0的设定值
不,它并没有忽略该成员。
mktime()
将 .tm_isdst
考虑在内,然后将所有 struct tm
成员调整为该日期的通常值,从而更改为 {{1} } 和 .tm_isdst
预计在 OP 的情况下,因为 .tm_hour
是 7 月 15 日“20210715”的白天。
如何使用 tmstr
或等效的东西,而不尝试将时间调整到我的时区?
mktime()
是本地时间转换。通常的方法是让 mktime()
推断出日光标志。
mktime()
这个时间是美国东部时间,已经根据夏令时进行了调整。
不,您断言这是美国标准东部时间 (EST)。美国东部时间 (ET) 有夏令时调整。
将您的时区从有日光和标准时段的时区更改为只有标准时段的时区。研究tmstr.tm_isdst = -1;
。也许就这么简单:
setenv()
缺少关键问题:// Implementation dependent code.
setenv("TZ","EST5",1);
tzset();
time_t seconds = mktime(&tmstr);
结果是否正确?
暂时忽略time_t
。报告了什么 tmstr
值?预期的 time_t
值是多少?
我怀疑 OP 确实得到了正确的 time_t
值,只是不是 time_t
中的预期结果。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。