V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
LiubaiQ
V2EX  ›  问与答

[请教]怎么确定某时区当前实行的是不是夏令时 ?

  •  
  •   LiubaiQ · 2020-08-06 11:51:24 +08:00 · 2016 次点击
    这是一个创建于 1570 天前的主题,其中的信息可能已经有所发展或是发生改变。

    语言:ts

    背景:发送请求时,要把用户选择的 date(Date 类型)转为 json,Date.prototype.toJSON 会根据系统时区( Local timezone ),根据 utcTime = date - (0 - localTimezoneOffset),计算出标准 UTC 时间,并转为 json 串。

    需求:不能根据系统时区转换,要根据用户设置中的时区( Personal timezone )获取标准 UTC 时间。

    问题:Date 的 api 包括 constructor 都是跟 local timezone 紧密相关的,除了修改系统时区,没找到其他办法修改 Date 依赖的时区。依赖于系统时区,则 OS 会判断当前时区实行的是不是夏令时,这个操作就不用手动维护,但依赖不得。。。只能想办法手动判断 personal timezone 当前是不是夏令时,关键是,有一百多个时区。。。。夏令时开始 /结束时间也不一样,夏令时比冬令时早多长时间也不一样( 0.5-1h ),哎,我绝望了都,大家有处理过类似需求吗?

    github 找了下,感觉都不计算夏令时的。。。。

    14 条回复    2020-08-07 10:11:42 +08:00
    594duck
        1
    594duck  
       2020-08-06 11:53:08 +08:00
    这东西是规则 ,计算是计算不了的。

    比如澳大利亚,就有二个州不搞冬令时和夏令时,维州有。
    opengps
        2
    opengps  
       2020-08-06 11:54:50 +08:00
    查看下百度地图,高德地图的 api,我记得在这里见过
    SD10
        3
    SD10  
       2020-08-06 12:02:42 +08:00
    一楼正解,是不是夏令时需要看当地规则,如果只是时区转换,那么现成的库就多了。
    hahastudio
        4
    hahastudio  
       2020-08-06 12:10:32 +08:00
    提供的用户时区的选择是应该包含地区的
    lxk11153
        5
    lxk11153  
       2020-08-06 12:21:09 +08:00
    题外: 好像时区是时区,夏令时是夏令时,然后当前时间 是几点几分,根据前两者计算出来的,对吗?

    本题: 你的意思是用户可以在页面设置自己使用的时区,然后在页面时间框里选择当前时间 几点几分,代码要算出 utc 时间?
    LiubaiQ
        6
    LiubaiQ  
    OP
       2020-08-06 13:05:46 +08:00
    @594duck 确实是规则,但是如果能确定是什么地区,夏令时起始时间不是固定的吗,比如美国,应该都是 3 月第二个周末到 11 月第一个周日。
    Jooooooooo
        7
    Jooooooooo  
       2020-08-06 13:10:36 +08:00
    写死的

    不过相当复杂, 不同国家还不一样
    LiubaiQ
        8
    LiubaiQ  
    OP
       2020-08-06 13:11:00 +08:00
    @opengps 我去看了下,返回值确实有夏令时偏移量,但必须传个经纬度啊,难道每个时区还得存下经纬度吗 QAQ,感觉不太行啊
    LiubaiQ
        9
    LiubaiQ  
    OP
       2020-08-06 13:12:02 +08:00
    @SD10 时区转换问题不大,关键是夏令时太难受了。。。难道真的要穷举吗
    richard1122
        10
    richard1122  
       2020-08-06 13:17:43 +08:00   ❤️ 1
    没读懂问题,但是夏令时这种是维护出来的: https://www.iana.org/time-zones 会定期更新
    LiubaiQ
        11
    LiubaiQ  
    OP
       2020-08-06 13:20:14 +08:00
    @lxk11153 是的,夏令时就是标准时区减去一小时,例如 UTC-08:00 西八区(此时也叫冬令时),到了夏令时开始,手表调快一小时,时间就和 UTC-07:00 西七区一样了,此时 web 上用户曾经选择的时间,就得按照 UTC-07:00 来显示,保存时,也要按照 UTC-07:00 来转成 UTC 时间。
    msg7086
        12
    msg7086  
       2020-08-06 18:48:25 +08:00
    夏令时的时候时区本来就会偏移。比如美国东部时间在冬天是 EST,到了夏天就是 EDT 。你冬天取到 EST 然后按照 EST 转换,夏天取到 EDT 按照 EDT 转换,应该是没有问题的。
    那么你说根据用户设置的时区来转换,这步就有问题了。比如说夏令时结束的这天的凌晨 2 点半 ET,就有可能是 EST 的 2 点半,也有可能是 EDT 的 2 点半。如果用户只是写了纽约时间的凌晨 2 点半,EDT 和 EST 都是有可能的,你怎么去判断呢。

    我觉得你提的这个需求是有点问题的,最好再考虑一下到底要做什么比较好。
    LiubaiQ
        13
    LiubaiQ  
    OP
       2020-08-07 09:35:35 +08:00
    @msg7086 哈哈哈哈,感谢老哥的回复,最后还是决定不再支持自动适应夏令时,改为用户自己设置当前是不是夏令时。
    julyclyde
        14
    julyclyde  
       2020-08-07 10:11:42 +08:00
    “根据 utcTime = date - (0 - localTimezoneOffset),计算出标准 UTC 时间”这个就是错的
    应该调用 tzdata 库里的信息来参与计算,并且这个库要经常更新(比如 2015 年朝鲜的东 8.5 时区)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   989 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 19:44 · PVG 03:44 · LAX 11:44 · JFK 14:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.