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

2020-08-06 11:51:24 +08:00
 LiubaiQ

语言: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 找了下,感觉都不计算夏令时的。。。。

2030 次点击
所在节点    问与答
14 条回复
594duck
2020-08-06 11:53:08 +08:00
这东西是规则 ,计算是计算不了的。

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

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

不过相当复杂, 不同国家还不一样
LiubaiQ
2020-08-06 13:11:00 +08:00
@opengps 我去看了下,返回值确实有夏令时偏移量,但必须传个经纬度啊,难道每个时区还得存下经纬度吗 QAQ,感觉不太行啊
LiubaiQ
2020-08-06 13:12:02 +08:00
@SD10 时区转换问题不大,关键是夏令时太难受了。。。难道真的要穷举吗
richard1122
2020-08-06 13:17:43 +08:00
没读懂问题,但是夏令时这种是维护出来的: https://www.iana.org/time-zones 会定期更新
LiubaiQ
2020-08-06 13:20:14 +08:00
@lxk11153 是的,夏令时就是标准时区减去一小时,例如 UTC-08:00 西八区(此时也叫冬令时),到了夏令时开始,手表调快一小时,时间就和 UTC-07:00 西七区一样了,此时 web 上用户曾经选择的时间,就得按照 UTC-07:00 来显示,保存时,也要按照 UTC-07:00 来转成 UTC 时间。
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
2020-08-07 09:35:35 +08:00
@msg7086 哈哈哈哈,感谢老哥的回复,最后还是决定不再支持自动适应夏令时,改为用户自己设置当前是不是夏令时。
julyclyde
2020-08-07 10:11:42 +08:00
“根据 utcTime = date - (0 - localTimezoneOffset),计算出标准 UTC 时间”这个就是错的
应该调用 tzdata 库里的信息来参与计算,并且这个库要经常更新(比如 2015 年朝鲜的东 8.5 时区)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/696101

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX