如何在不修改时间的情况下仅更改时区

时间:2016-06-21 17:10:32

标签: javascript momentjs datetime-format

我有2016-06-21T10:00:00-07:00格式的日期和时间,它代表06/21/2016 5 PM在太平洋标准时间,我只想将其更改为06/21/2016 5 PM in EST,反之亦然。我怎么能用momentz做到这一点?

JSFiddle

debugger;
var dateTime = moment('2016-06-21T10:00:00-07:00');
var newDateTime = dateTime.clone();
  newDateTime.tz('US/Eastern');
//dateTime = dateTime.utc();
    console.log(dateTime.utcOffset());

   console.log(newDateTime.utcOffset());
  console.log(newDateTime.utcOffset() - dateTime.utcOffset());
                //console.log(utc.format());
    dateTime =          dateTime.add(newDateTime.utcOffset(), 'minutes');
console.log(dateTime.format());
console.log(new Date(Date.parse(dateTime.format())).toJSON());

修改

给定输入= 2016-06-21T08:00:00-07:00(太平洋标准时间)

预期产量= 2016-06-21T08:00:00-04:00(EST)

因此,当我将其转换为UTC时,它应该变为

2016-06-22T15:00:00Z为PST 2016-06-22T12:00:00Z为EST

2 个答案:

答案 0 :(得分:5)

我认为您对ISO8601格式的工作原理感到困惑。此格式始终表示具有时区偏移的本地时间。因此,2016-06-21T10:00:00-07:00代表2016年6月21日上午10点,时区目前为UTC-7(这可能是美国太平洋地区,以及许多其他地区)。

听起来你想要占用当地时间,但把它放在一个新的时区。这会打开一些有趣的问题,说明为什么以您的格式收到日期。如果要将日期解释为全局时间轴上的确切点,那么您接收它的格式是好的。但是,如果日期被解释为当地时间(不是相对于UTC),则可能值得考虑日期格式需要在源头更改的可能性。例如,如果您正在向API发出ajax请求,并且它以此格式返回日期,但该日期实际上与UTC没有关系,那么尝试将该API更改为仅发送本地时间会更好(没有偏移)。如果您能够这样做,那么以下代码将起作用:

moment.tz('2016-06-21T10:00:00', 'America/New_York').format()
"2016-06-21T10:00:00-04:00"

如果您无法做到这一点,或者日期应被解释为全球时间轴上的确切点,但您希望在特定用例中忽略该日期,则可以这样做。您需要指定一种解析格式,忽略初始时间戳上的时区偏移量。代码如下:

moment.tz('2016-06-21T10:00:00-07:00', 'YYYY-MM-DDTHH:mm:ss', 'America/New_York').format()
"2016-06-21T10:00:00-04:00"

您可能会受益于this blog post中的材料,因为它涵盖了ISO8601格式的工作原理,以及所有时刻的构造函数的工作原理。

答案 1 :(得分:0)

Checkout moment().utcOffset()您可以将offset作为参数传递给此函数,日期将使用该区域设置。

假设您事先知道所需的utcOffsets,在您的情况下是-420和-240或-300(与DayLightSaving的EST)。可以在下面完成

var dateTime = moment('2016-06-21T10:00:00-07:00');
dateTime.utcOffset(-420).format();
"2016-06-21T10:00:00-07:00"
dateTime.utcOffset(-240).format()
"2016-06-21T13:00:00-04:00"

注意:With -04:00, it should 13:00:00 and not 07:00:00 - http://www.timeanddate.com/time/zones/est

编辑:这个答案被发布到问题的早期版本,其中在不同的时区需要相同的时间。如果不正确,请详细说明它是怎样的。 谢谢!