我正在尝试将我认为是UTC字符串的时间信息转换为std::mktime在C++中使用的时间戳.我的问题是,<ctime>/ <time.h>没有转换为UTC的功能; mktime只会将时间戳作为本地时间返回.
所以我需要弄清楚时区偏移量并将其考虑在内,但我找不到与平台无关的方法,不涉及将整个代码移植到boost::date_time.有一些我忽略的简单解决方案吗?
我怎样才能转换ASN1_TIME成time_t格式?我想将返回值转换X509_get_notAfter()为秒.
我正在使用Visual Studio c ++ Compiler(2010),但该库具有不同的ANSI C和POSIX库函数的实现.
ANSI C函数和Windows CRT实现有什么区别?例如tzset()和/ _tzset()或setenv()ans有_setenv()什么区别?似乎以同样的方式做同样的事情......
我正在使用msvc(2010),我是否更喜欢Windows CRT实现?
编辑1
好吧,我希望以可移植的方式转换一个以UTC表示的结构tm time_t,但是没有可移植的方法来做到这一点.我要为不同的平台(Android,Linux,Windows,Windows CE)编写功能.
我已经看过这个使用的stackoverflow帖子setenv,getenv和tzset
EDIT2
不幸的是,经过一些测试,我发现getenv("TZ")在Windows上返回一个空指针.但为什么如此困难将UTC时间结构转换为time_t?
编辑3
从Boost中我发现了boost/chrono/io/time_point_io.hpp中的这段代码.希望这对我有所帮助.
inline int32_t is_leap(int32_t year)
{
if(year % 400 == 0)
return 1;
if(year % 100 == 0)
return 0;
if(year % 4 == 0)
return 1;
return 0;
}
inline int32_t days_from_0(int32_t year)
{
year--;
return 365 * year …Run Code Online (Sandbox Code Playgroud) 此答案显示了如何将字符串解析为std::chrono::time_point,如下所示:
std::tm tm = {};
std::stringstream ss("Jan 9 2014 12:35:34");
ss >> std::get_time(&tm, "%b %d %Y %H:%M:%S");
auto tp = std::chrono::system_clock::from_time_t(std::mktime(&tm));
Run Code Online (Sandbox Code Playgroud)
如果我想std::chrono::time_point从一个(Gregorian)日历日期创建一个在编译时就知道其年,月和日的日历日期,是否有比上述字符串解析更简单的方法呢?