如何正确计算+8时区1900/1/1,经过了365*100天之后的时间?

首先要注意到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的。

阅读 434
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题