我们的系统从供应商那里接收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结构转换到秒。
这是Redhat版本6.10下的g++版本7.3.1。
发布于 2021-07-23 01:21:07
在这里更容易发帖...
从mktime手册页上看,您没有读到所写的内容...
mktime()函数将分解的时间结构转换为日历时间表示形式。该函数忽略调用方在tm_wday和tm_yday字段中提供的值。在tm_isdst字段中指定的值通知mktime()在tm结构中提供的时间内夏令时( DST )是否有效:正值意味着夏令时有效;零意味着夏令时无效;负值意味着mktime()应该(使用时区信息和系统数据库)尝试确定夏令时在指定时间是否有效。
mktime()函数按如下方式修改tm结构的字段: tm_wday和tm_yday被设置为从其他字段的内容确定的值;如果结构成员在其有效间隔之外,它们将被标准化(例如,将10月40改为11月9日);将tm_isdst分别设置为正值或0,以指示在指定时间是否有效。调用mktime()还用当前时区的信息设置外部变量tzname。
发布于 2021-07-23 01:43:46
忽略0的设置值
不,它不是忽略该成员。
mktime()
将.tm_isdst
考虑在内,然后将所有struct tm
成员调整为其在该日期的常规值,因此在OP的情况下预计会更改为.tm_isdst
和 .tm_hour
,因为7月15日"20210715“的tmstr
是在白天。
我如何使用
mktime()
或类似的东西,而不尝试将时间调整到我的时区?
mktime()
是本地时间转换。通常的方法是让mktime()
推导出日光标志。
tmstr.tm_isdst = -1;
这次是美国东部时间,并且已经根据夏令时进行了调整。
不,您是在断言现在是美国标准东部时间(EST)。美国东部时间(ET)有日光调整。
将您的时区从具有日光和标准时段的时区更改为仅具有标准时段的时区。研究setenv()
。也许就像这样简单:
// Implementation dependent code.
setenv("TZ", "EST5", 1);
tzset();
time_t seconds = mktime(&tmstr);
缺少关键问题: time_t
结果是否正确?
暂时忽略tmstr
。报告的time_t
值是多少?time_t
的期望值是多少?
我怀疑OP确实得到了正确的time_t
值,只是在struct tm
中没有得到预期的结果。
https://stackoverflow.com/questions/68476500
复制相似问题