【发布时间】:2020-04-27 04:03:32
【问题描述】:
这是场景:
1- 用户打开网站,并使用下拉字段输入上午 07:00,这将给我这个:
// 1578600000000 => 保存到数据库 // 2020 年 1 月 10 日星期五 07:00:00 GMT+1100(澳大利亚东部夏令时间)
用户本人在悉尼,这意味着他的本地时钟在GMT+1100
不过,他希望这次代表亚洲/德黑兰时间,因为那是他明天要去的地方。所以本质上,他希望我完全忽略他的当地时间,并把他看作是在亚洲/德黑兰。所以当他明天在Tehran 时,他可以看到他的日历有07:00am。
另一方面,全世界的人都会看到他的空闲时间,比如说来自Australia/Perth。
根据momentJS 文档,我认为类似下面的工作,但事实并非如此。
首先,将时区转换为Asia/Tehran,这是用户想要的地方:
const desiredTimeZone = 'Asia/Tehran';
let OriginalDesired = moment.tz(1578600000000,desiredTimeZone);
然后,当向Australia/Perth 中的人表示它时,请确保它在他们的时区中
const PerthTimeZone = 'Australia/Perth`; // this is dynamic, can be anything
OriginalDesired.clone().tz(PerthTimeZone);
我天真地认为这应该可行。但我注意到原始时间戳1578600000000 是UTC 时间戳,这意味着它不是真正的07:00am,它实际上是20:00pm,因为Javascript
已从用户条目中减去 11 小时,这是原始用户本地时区的偏移量。
我设法通过以一种戏剧性的方式添加和减去偏移量来解决它,但它只适用于一种情况。
const originalTime = 1578600000000;
const LocalAdjustment = moment(originalTime).tz("Australia/Sydney").utcOffset() * 60000;
const DesiredAdjustment = moment(originalTime).tz("Asia/Tehran").utcOffset() * 60000;
const newUTC = originalTime + LocalAdjustment - DesiredAdjustment;
当向Tehran中的用户表示这个时
moment(newUTC).tz("Asia/Tehran").format('hh:mma'); // 07:00am.
我知道这可能很愚蠢,而且显然只在一种情况下有效,但这是我要走的正确道路吗?还是有更简单的方法?
顺便说一句,所有的计算都在我的服务器上,即“UTC”。
【问题讨论】:
-
第一个示例的值是存储在数据库中的 1578600000000 还是 1578600000000 + 11 小时? momentjs 以 UTC 存储和操作,并且您希望存储 与当前 UTC 时间的偏移量。尝试使用
OriginalDesired.utcOffset(yourTzOffset, true)更改内部 UTC 表示以匹配您所需的时区。
标签: javascript timezone momentjs timezone-offset