Javascript MomentJS,如何忽略用户';s本地时区,并使用

Javascript MomentJS,如何忽略用户';s本地时区,并使用,javascript,timezone,momentjs,timezone-offset,Javascript,Timezone,Momentjs,Timezone Offset,以下是场景: 1-用户打开网站,并使用下拉字段输入07:00 am,该字段将给出以下信息: //15786000000=>保存到数据库 //2020年1月10日星期五07:00:00 GMT+1100(澳大利亚东部夏时制) 用户自己在悉尼,这意味着他的本地时钟在GMT+1100 然而,他希望这次代表亚洲/德黑兰时间,因为那是他明天要去的地方。所以本质上,他希望我完全忽略他的当地时间,把他看成是在亚洲/德黑兰。所以当他明天在德黑兰的时候,他可以看到他的日历是早上7:00 另一方面,全世界的人都会看

以下是场景:

1-用户打开网站,并使用下拉字段输入07:00 am,该字段将给出以下信息:

//15786000000=>保存到数据库 //2020年1月10日星期五07:00:00 GMT+1100(澳大利亚东部夏时制)

用户自己在悉尼,这意味着他的本地时钟在
GMT+1100

然而,他希望这次代表亚洲/德黑兰时间,因为那是他明天要去的地方。所以本质上,他希望我完全忽略他的当地时间,把他看成是在亚洲/德黑兰。所以当他明天在德黑兰的时候,他可以看到他的日历是早上7:00

另一方面,全世界的人都会看到他的空闲时间,比如说从
澳大利亚/Perth

根据
momentJS
文档,我认为下面的工作是可行的,但事实并非如此

首先,将时区转换为
亚洲/德黑兰
,这是用户想要的地方:

const desiredTimeZone = 'Asia/Tehran';
let OriginalDesired = moment.tz(1578600000000,desiredTimeZone);
然后,当向
澳大利亚/珀斯的人们表示它时,确保它在他们的时区内

const PerthTimeZone = 'Australia/Perth`; // this is dynamic, can be anything

OriginalDesired.clone().tz(PerthTimeZone);
我天真地认为这应该行得通。但是我注意到原来的时间戳
15786000000
UTC
时间戳,这意味着它实际上不是
07:00am
,而是
20:00pm
,因为Javascript
已从用户条目中减去
11
hours,这是原始用户的本地时区偏移量

我通过戏剧性地增减偏移量来解决这个问题,但它只在一种情况下有效

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-用户打开网站,并使用下拉字段输入07:00 am,这将给我这个:://15786000000

你已经输了。如果本地时区不相关,那么不要编写假定它相关的代码

换言之,您可能有以下几点:

moment("2020-01-10 07:00")
相反,您应该有如下内容:

moment.tz("2020-01-10 07:00", "Asia/Tehran")
或者更确切地说,您只需将
“2020-01-10 07:00”
“亚洲/德黑兰”
发送到您的数据库,然后稍后检索它们,并在需要知道代表什么时刻时将它们传递到时刻时区

至于您的另一种方法,一般来说,从时间戳中添加或减去时区偏移不是一个好主意。Unix时间戳本质上是基于UTC的。加法或减法将产生不同的时间点,而不是根据时区进行调整


考虑到代码返回的偏移量不正确的可能性也很小(但并非不可能),因为它们必须在查找之前进行移位。换言之,德黑兰在所讨论的日期是UTC+3:30,因此传递的时间戳必须在传递到当前时间之前调整3小时3分钟。这导致了循环逻辑,很难解决。它将显示转换附近的时间戳(DST或特定时区的标准时间更改)。

第一个示例中的值是存储在数据库中的15786000000还是15786000000+11小时?momentjs在UTC上存储和操作,您希望存储当前UTC时间的偏移量。尝试使用
OriginalDesired.utcOffset(yourTzOffset,true)
更改内部UTC表示以匹配所需的时区。非常感谢,我成功地完成了这项工作,而无需将整个代码库从时间戳移到其他选项。不幸的是,我决定在UI代码中使用date fns,这在一开始似乎比矩.js好得多,但是,当涉及时区时,date fns远远不是一个可靠的选项。MomentJS处理timzone转换的方式更简单、更可靠。再次感谢旁注,我现在将实际日期保存为字符串,以及数据库中的时间戳,当对数据库进行查询时,我总是根据当前用户的时区动态调整它们。虽然我会读越来越多的书来理解,但你认为这有问题吗?DTS很快就会成为问题吗?哪个DB?大多数都有合适的日期和时间类型。避免存储为字符串。此外,矩处于维护模式。你可以试试看