C++ 在MSVC中获取负“time”的DST

C++ 在MSVC中获取负“time”的DST,c++,visual-c++,c++14,dst,localtime,C++,Visual C++,C++14,Dst,Localtime,我试图确定给定的时间值是否在给定时区的DST中。所以我写了如下内容: inline bool is_DST(time_t t) { struct tm* ti = localtime(&t); return ti->tm_isdst > 0; } 这在当今时代非常有效。例如,在当前时间t值上,它返回true。对于J2000纪元,它返回false。很好 不幸的是,MSVC变量在负输入时返回nullptr。阅读上面链接的文档告诉我,3000年后它也会失败。因此,

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

inline bool is_DST(time_t t) {
    struct tm* ti = localtime(&t);
    return ti->tm_isdst > 0;
}
这在当今时代非常有效。例如,在当前时间t值上,它返回
true
。对于J2000纪元,它返回
false
。很好

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

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

根据上述推断,我可以选择哪些选项来实现适用于64位
时间给定的日期范围(±2.9*1011年左右)的
is DST(…)


*关于这是否是正确的,还有一些疑问。闰秒是在1972年引入的,向后推算UTC意味着您必须假设没有闰秒(本来会有)。而推算UTC前进也很困难,因为地球自转使闰秒无法预测。

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

它是开源的,适用于VS-2013及更高版本。下面是如何使用它来实现
isdst

#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;
}

Windows上的范围是
[-27258-04-19 21:11:54.5224192、31197-09-14 02:48:05.4775807]
。对该范围的限制是,这是VS
系统时钟::时间点的范围(精度为100ns,存储为
int64\t
)。

如果您不介意保持自己的最新,已经发布了一个免费的C++11/14,它是在
的基础上构建的,并附带了对闰秒的支持。@ildjarn:如果你愿意回答这个问题,我会投赞成票。;-)诚然,它无法处理+/-2920亿年的范围。但它可以处理+/-32000年的范围(这并不是说它有意义,但它可以做到)。@HowardHinnant:把这个留给你似乎是对的。:-]@imallett,既然您已经标记了这个
visual-c++
,我假设使用Windows API不是问题,在这种情况下,支持年份1601到30827。
return locate_zone("Europe/Monaco")
                        ->get_info(system_clock::from_time_t(t)).save != 0min;