首先要注意到1901年之后,+8时区才是+8小时。
首先是浏览器chrome的版本(firefox其实能更精确,getTimezoneOffset()是浮点数):
new Date(d.getTime()+100*365*24*60*60*1000).toLocaleString()
//'1999/12/8 00:23:18'
new Date(d.getTime()+100*365*24*60*60*1000).toUTCString()
//'Tue, 07 Dec 1999 16:23:18 GMT'
new Date(d.getTime()+100*365*24*60*60*1000).toISOString()
//'1999-12-07T16:23:18.000Z'
new Date(1900,0,1) + 100*365*24*60*60*1000
//'Mon Jan 01 1900 00:00:00 GMT+0736 (香港标准时间)3153600000000'
然后是最新vs2022的c++版本。(应该是支持闰秒和iana数据库的)
//1900/1/1的本地时间
ch::local_seconds some_day((ch::local_days)(ch::year(1900) / 1 / 1));
//1900/1/1的+8区时间
ch::zoned_time some_zone_time("Asia/Shanghai", some_day);
//+8区时间1900/1/1的utc时间
ch::utc_time some_utc_time = ch::utc_clock::from_sys(some_zone_time.get_sys_time());
ch::sys_time some_sys_time = some_zone_time.get_sys_time();
//上面本地时间100年后
auto after_day = some_day + ch::days(100 * 365);
//上面utc时间100年后
auto after_utc_time = some_utc_time + ch::days(100 * 365);
//utc转换的sys
auto after_sys_time = ch::utc_clock::to_sys(after_utc_time);
//sys转换成+8区时间
ch::zoned_time after_utc_to_local_time("Asia/Shanghai", after_sys_time);
std::println(std::cout, "some_utc_time = {}", some_utc_time);
std::println(std::cout, "some_sys_time = {}", some_sys_time);
std::println(std::cout, "after_day = {}", after_day);
std::println(std::cout, "after_utc_time = {}", after_utc_time);
std::println(std::cout, "after_utc_to_local_time = {}", after_utc_to_local_time);
c++的输出:
some_utc_time = 1899-12-31 15:54:17
some_sys_time = 1899-12-31 15:54:17
after_day = 1999-12-08 00:00:00
after_utc_time = 1999-12-07 15:53:55
after_utc_to_local_time = 1999-12-07 23:53:55 GMT+8
另外,在https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refer... 有一段说到1943-01-27的timezoneoffset也是特殊的,但是我在c++这边,却没能实验出来,这个时间点依然是+08:00的。