语言: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 找了下,感觉都不计算夏令时的。。。。
1
594duck 2020-08-06 11:53:08 +08:00
这东西是规则 ,计算是计算不了的。
比如澳大利亚,就有二个州不搞冬令时和夏令时,维州有。 |
2
opengps 2020-08-06 11:54:50 +08:00
查看下百度地图,高德地图的 api,我记得在这里见过
|
3
SD10 2020-08-06 12:02:42 +08:00
一楼正解,是不是夏令时需要看当地规则,如果只是时区转换,那么现成的库就多了。
|
4
hahastudio 2020-08-06 12:10:32 +08:00
提供的用户时区的选择是应该包含地区的
|
5
lxk11153 2020-08-06 12:21:09 +08:00
题外: 好像时区是时区,夏令时是夏令时,然后当前时间 是几点几分,根据前两者计算出来的,对吗?
本题: 你的意思是用户可以在页面设置自己使用的时区,然后在页面时间框里选择当前时间 几点几分,代码要算出 utc 时间? |
6
LiubaiQ OP @594duck 确实是规则,但是如果能确定是什么地区,夏令时起始时间不是固定的吗,比如美国,应该都是 3 月第二个周末到 11 月第一个周日。
|
7
Jooooooooo 2020-08-06 13:10:36 +08:00
写死的
不过相当复杂, 不同国家还不一样 |
8
LiubaiQ OP @opengps 我去看了下,返回值确实有夏令时偏移量,但必须传个经纬度啊,难道每个时区还得存下经纬度吗 QAQ,感觉不太行啊
|
10
richard1122 2020-08-06 13:17:43 +08:00 1
没读懂问题,但是夏令时这种是维护出来的: https://www.iana.org/time-zones 会定期更新
|
11
LiubaiQ OP @lxk11153 是的,夏令时就是标准时区减去一小时,例如 UTC-08:00 西八区(此时也叫冬令时),到了夏令时开始,手表调快一小时,时间就和 UTC-07:00 西七区一样了,此时 web 上用户曾经选择的时间,就得按照 UTC-07:00 来显示,保存时,也要按照 UTC-07:00 来转成 UTC 时间。
|
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 都是有可能的,你怎么去判断呢。 我觉得你提的这个需求是有点问题的,最好再考虑一下到底要做什么比较好。 |
14
julyclyde 2020-08-07 10:11:42 +08:00
“根据 utcTime = date - (0 - localTimezoneOffset),计算出标准 UTC 时间”这个就是错的
应该调用 tzdata 库里的信息来参与计算,并且这个库要经常更新(比如 2015 年朝鲜的东 8.5 时区) |