花了一天时间,使用 __time64_t 解决了 2038 年的问题。
我以为一切ok,但今天早上无意发现,1969年,使用 __time64_t 无法表示。
先上段代码:
__time64_t date_time(int year, int month, int day, int hour, int minute, int second) { __time64_t rawtime; _time64(&rawtime); struct tm *timeinfo = _gmtime64(&rawtime); //struct tm *timeinfo = _localtime64(&rawtime); timeinfo->tm_year = year - 1900; timeinfo->tm_mon = month - 1; timeinfo->tm_mday = day; timeinfo->tm_hour = hour; timeinfo->tm_min = minute; timeinfo->tm_sec = second; __time64_t v = _mktime64(timeinfo); return v; }
如果指定 year 为 1969,或者说是 1970 年以前的任意一个年份, _mktime64() 函数直接返回 -1
哎呦,我去!
指定 year 到 2100 年都没事,却无法指定到 1969年。
后来网上搜索了一下,看到一篇介绍说,在 linux 下, _mktime64() 能支持到 1900 年开始,但是在 windows 下,_mktime64() 只能支持从 1970 开始。
如果能支持到 1900 年开始,也基本能满足未来绝大多数的需求场景了。
花了一二个小时也没找到好的解决方案。
只好改用 double 结合 SYSTEMTIME 和 GetLocalTime() 以及 SystemTimeToVariantTime() ... 来替换所有的 __time64_t 实现。
参考资料:https://docs.microsoft.com/zh-cn/windows/win32/sysinfo/time-functions?redirectedfrom=MSDN