让 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 中的预期结果。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...