补偿Moment.js中的utcOffset

Compensate for utcOffset in Moment.js

本文关键字:utcOffset 中的 js Moment 补偿      更新时间:2023-09-26

首先我希望这不是重复的。我读过很多类似的问题,但找不到一个与这个特定问题有关的问题。

我有一个javascript日期选择器,它在内部使用javascript日期,这会产生意想不到的副作用。当我选择2016年4月30日时,它会返回该日期午夜(00:00)的日期对象,但如果您在不同的时区,并且它在内部使用UTC,它将返回一个补偿您的UTC偏移的对象。所以,因为这里是英国夏令时,我回来的日期是4月30日00:00 GTM+1:00,当你把它变成ISO字符串时,实际上是4月29日23:00。

我想把正确的日期(4月30日,没有时间)发送回服务器,但我目前在做这件事时得到的日期字符串:

var newDate =  moment(newValue).toISOString();
console.log(newDate);

这是吗

2016-05-19T23:00:00.000Z

所以,我对此的理解很弱,但我认为日期选择器最初使用我的本地时间偏移量来休息一个小时,如果在内部存储19日23:00作为UTC日期,那么它已经是UTC日期了,转换为UTC没有帮助。

我需要做的是使用moment.js来补偿utcOffset,并将日期移动到我选择的UTC日期的午夜。

您在这里看到的是JS Date对象和MomentJS在内部都包含一个以毫秒为单位的Unix时间戳。这些时间戳是对全局时间线上某个点的引用,如果需要,可以将其转换为本地时间。

当您使用默认的moment()构造函数时,您告诉Moment在"本地"模式下操作。这意味着,当Moment显示其包含的日期时,它将从内部包含的UTC Unix时间戳转换为用户的本地时间。

如果你想保留UTC时间(你没有),你可以把从日期选择器中得到的JS Date对象传递给moment.utc()函数,然后当你在那一刻调用.format()时,你总是会看到UTC时间。

举个例子,我现在在美国中部夏令时,偏移量为-5。

如果我以UTC时间戳为例,并将其传递给默认时刻构造函数,我会得到以下内容:

moment('2016-05-19T23:00:00.000Z').format()
"2016-05-19T18:00:00-05:00"

如您所见,出于显示目的,Moment已转换为我的本地时区。

如果我使用UTC:

moment.utc('2016-05-19T23:00:00.000Z').format()
"2016-05-19T23:00:00+00:00"

没有变化。

你不需要担心你在评论中所说的时钟变化。由于您的日期选择器在全局时间线上为您提供了一个精确的点,所以时刻总是能够正确地转换为本地时间。

至于为什么.toISOString()在JS date对象上调用它时总是给你一个UTC日期,你可以感谢TC39委员会。根据ES2015规范,它应该是这样工作的:http://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.toisostring

Moment还总是为.toISOString()提供UTC,以便与本地日期的工作方式保持一致。