您说:
这里是场景:
1-用户打开网站,然后使用下拉字段输入07:00,这将为我提供::>
// 1578600000000 =>保存到数据库// 2020年1月10日星期五格林尼治标准时间+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'。
[这里是场景:1-用户打开网站,并使用下拉字段输入上午07:00,这将为我提供以下信息:// 1578600000000 =>保存到数据库//格林尼治标准时间2020年1月10日07:00:00 GMT +1100(澳大利亚...
您说:
1-用户打开网站,并使用下拉字段输入上午07:00,这将为我提供:// 1578600000000 ...
您已经迷路了。如果本地时区不相关,则不要编写假定与当地时区相关的代码。
换句话说,您可能有类似的东西:
moment("2020-01-10 07:00")
相反,您应该有类似的东西:
moment.tz("2020-01-10 07:00", "Asia/Tehran")
或更确切地说,您应该只将
"2020-01-10 07:00"
和"Asia/Tehran"
发送到您的数据库,然后在需要知道代表什么时刻时将它们检索并传递给moment-timezone。关于您的其他方法,从时间戳中添加或减去时区偏移通常不是一个好主意。 Unix时间戳本质上是基于UTC的。加法或减法会产生不同的时间,而不是针对时区进行调整。 (有关此逻辑差异的幽默可视化,请参见this Dilbert cartoon。)
考虑到您的代码返回的偏移量不正确的可能性也很小(但并非不可能),因为在查找之前必须将其偏移。换句话说,德黑兰在所讨论的日期是UTC + 3:30,因此必须将传递给时间戳构造函数的时间戳调整3小时3分钟。这导致循环逻辑,并且难以解决。它将显示过渡附近的时间戳(DST或特定时区的标准时间更改)。
您说: