首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >让mktime()忽略C++中的DST和本地时区

让mktime()忽略C++中的DST和本地时区
EN

Stack Overflow用户
提问于 2021-07-22 05:10:49
回答 2查看 155关注 0票数 0

我们的系统从供应商那里接收ASCII格式为"20210715083015“的数据。现在是美国东部时间,已经根据夏令时进行了调整。

我们的后端需要从Epoch开始的纳秒时间。我尝试使用mktime()进行转换,但是mktime()坚持为DST添加一个小时,即使我强制tm_isdst为0。

下面是代码片段:

代码语言:javascript
运行
复制
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;

下面是输出:

代码语言:javascript
运行
复制
isdst before: 0, isdst after: 1

它忽略了设置值0,并应用了自己的转换。

我如何使用mktime(),或者类似的东西,而不是尝试将时间调整到我的时区?我不想在内部设置时区,我只想让它直接从tm结构转换到秒。

这是Redhat版本6.10下的g++版本7.3.1。

EN

回答 2

Stack Overflow用户

发布于 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。

票数 0
EN

Stack Overflow用户

发布于 2021-07-23 01:43:46

忽略0的设置值

不,它不是忽略该成员。

mktime().tm_isdst考虑在内,然后将所有struct tm成员调整为其在该日期的常规值,因此在OP的情况下预计会更改为.tm_isdst .tm_hour,因为7月15日"20210715“的tmstr是在白天。

我如何使用mktime()或类似的东西,而不尝试将时间调整到我的时区?

mktime()是本地时间转换。通常的方法是让mktime()推导出日光标志。

代码语言:javascript
运行
复制
tmstr.tm_isdst = -1;

这次是美国东部时间,并且已经根据夏令时进行了调整。

不,您是在断言现在是美国标准东部时间(EST)。美国东部时间(ET)有日光调整。

将您的时区从具有日光和标准时段的时区更改为仅具有标准时段的时区。研究setenv()。也许就像这样简单:

代码语言:javascript
运行
复制
// 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中没有得到预期的结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68476500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档