gpt4 book ai didi

c++ - 在 MSVC 中获取负 `time_t` 的 DST

转载 作者:行者123 更新时间:2023-11-30 03:41:39 47 4
gpt4 key购买 nike

我正在尝试确定给定的 time_t 值是否在给定时区的 DST 中。所以我写了如下内容:

inline bool is_DST(time_t t) {
struct tm* ti = localtime(&t);
return ti->tm_isdst > 0;
}

这在当前时代非常有用。例如,对于当前的 time_t 值,它返回 true。对于 J2000 纪元,它返回 false。不错。

不幸的是,localtime(...) 的 MSVC 变体在负输入上返回 nullptr。阅读上面链接的文档告诉我它也会在 3000 年后失败。因此,例如 (time_t)(-1) (对应于 1969-12-31 23:59:59)将导致段错误。

这很糟糕。 1969 年并不是很久以前。标准做法是在假设 1972 年之前或 future 任何地方(直到宣布)都没有闰秒的情况下推断 UTC。*

我有什么选择来实现 is_DST(...) 将适用于 64 位 time_t (±2.9*10< sup>11 年左右)基于上述推断?

*有人质疑这是否正确。闰秒于 1972 年引入,向后推断 UTC 意味着您必须假设没有闰秒(本来会有)。向前推断 UTC 也很困难,因为地球的自转使得闰秒不可预测。

最佳答案

这是 ildjarn 在评论中提到的库:

https://github.com/HowardHinnant/date

它是开源的,适用于 VS-2013 及更高版本。以下是您将如何使用它来实现 is_DST :

#include "tz.h"
#include <ctime>

bool
is_DST(std::time_t t)
{
using namespace std::chrono;
using namespace date;
return current_zone()->get_info(system_clock::from_time_t(t)).save != 0min;
}

这将适用于负数 time_t , 但不适用于 64 位的全部范围 time_t (这将是 +/- 2920 亿年)。但它很容易回到 1800 年代中期首次引入统一时间时。

在 Windows 上,您必须安装 libcurl ,或手动下载 IANA timezone database .

如果您想回答计算机当前时区以外的某个时区的问题,这很简单:

return locate_zone("Europe/Monaco")
->get_info(system_clock::from_time_t(t)).save != 0min;

Windows 上的范围是 [-27258-04-19 21:11:54.5224192, 31197-09-14 02:48:05.4775807] .这个范围的限制是这是VS system_clock::time_point的范围(精度为 100ns,存储为 int64_t )。

关于c++ - 在 MSVC 中获取负 `time_t` 的 DST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37261195/

47 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com