这是场景:
1-用户打开网站,并使用下拉字段输入 07:00 am,这将给我以下信息:
//1578600000000 => 保存到数据库 //2020 年 1 月 10 日星期五 07:00:00 GMT+1100(澳大利亚东部夏令时间)
用户本人位于悉尼,这意味着他的本地时钟为GMT+1100
但是,他希望将此时表示为亚洲/德黑兰时间,因为那是他明天要去的地方。所以本质上,他希望我完全忽略他本地时间并把他视为在亚洲/德黑兰。因此,当他明天到达德黑兰
时,他可以看到他的日历有07:00am
。
另一方面,世界各地的人都会看到他的空闲时间,比如说来自澳大利亚/珀斯
。
根据 momentJS
文档,我认为类似下面的内容可以工作,但事实并非如此。
首先,将时区转换为 Asia/Tehran
,这是用户想要的地方:
const desiredTimeZone = 'Asia/Tehran';
let OriginalDesired = moment.tz(1578600000000,desiredTimeZone);
然后,当向澳大利亚/珀斯
的人们展示它时,请确保它位于他们的时区
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;
当向德黑兰的用户展示这一点时
moment(newUTC).tz("Asia/Tehran").format('hh:mma'); // 07:00am.
我知道这可能很愚蠢,而且显然只在一种情况下有效,但这是我要走的正确道路吗?或者有更简单的方法吗?
顺便说一句,所有计算都在我的服务器上进行,即“UTC”。
最佳答案
你说:
1- User opens the website, and enters 07:00 am using a dropdown field, which will give me this : // 1578600000000 ...
你已经输了。如果本地时区不相关,则不要编写假设它相关的代码。
换句话说,您可能有以下内容:
moment("2020-01-10 07:00")
相反,你应该有类似的东西:
moment.tz("2020-01-10 07:00", "Asia/Tehran")
或者更确切地说,您应该简单地发送 "2020-01-10 07:00"
和"Asia/Tehran"
到您的数据库,然后当您需要知道代表哪个时刻时检索它们并将它们传递给时刻时区。
至于您的其他方法,从时间戳中添加或减去时区偏移量通常不是一个好主意。 Unix 时间戳本质上是基于 UTC 的。添加或减去将产生不同的时间点,而不是根据时区进行调整。
考虑到代码返回的偏移量不正确的可能性也很小(但并非不可能),因为在查找之前必须对它们进行移位。换句话说,德黑兰在相关日期的时间为 UTC+3:30,因此在传递给 moment 构造函数之前,传递的时间戳必须调整 3 小时 3 分钟。这会导致逻辑循环,很难解决。它将显示转换附近的时间戳(无论是 DST,还是特定时区标准时间的更改)。
关于javascript - MomentJS,如何忽略用户的本地时区,并使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59665844/