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

use*_*862 2 javascript datetime-format momentjs

我有2016-06-21T10:00:00-07:00格式的日期和时间,它代表06/21/2016下午5点在太平洋标准时间,我只想将此更改为06/21/2016 5 PM在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());
Run Code Online (Sandbox Code Playgroud)

编辑:

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

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

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

2016-06-22T15:00:00Z为太平洋标准时间2016-06-22T12:00:00Z为EST

Mag*_*int 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"
Run Code Online (Sandbox Code Playgroud)

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

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"
Run Code Online (Sandbox Code Playgroud)

您可能会受益于此博客文章中的内容,因为它涵盖了ISO8601格式的工作原理,以及所有时刻的构造函数的工作原理.