2016-06-21 87 views
2

我有2016-06-21T10:00:00-07:00格式的日期和时间,代表06/21/2016 5PM在PST中,我只想将其更改为美国东部时间2016年6月21日下午5点,反之亦然。我该如何与时刻做到这一点?如何在不修改时间的情况下仅更改时区

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(PST)

预期输出= 2016-06- 21T08:00:00-04:00(EST)

所以当我将它转换为UTC时,它应该变成

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

回答

2

我认为你对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如何工作,以及如何所有的时刻的构造函数工作。

+0

这就是我要找的,谢谢。 – user1614862

+0

我无法删除偏移量,但我也有UTC格式的同一时间。所以,我总共有三个输入,其中一个是dateTime,带有UTC和目标时区的偏移量和日期时间。 – user1614862

0

结帐moment().utcOffset()您可以在抵消作为参数传递给这个函数传递和日期将使用该语言环境。

假设您事先知道需要的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

编辑:这个答案被张贴了问题,其中需要在不同的时区同时的早期版本。如果不正确,请详细说明它是如何发生的。 谢谢!

+0

我编辑了我的问题与预期的输入和输出。 – user1614862

+0

从不特殊情况时区转换。由于政府经常更改时区规则,因此不能保证今天运行的代码将在明天工作。使用时区库来处理这个问题。有关时区更改频率的更多信息,请参阅http://codeofmatt.com/2016/04/23/on-the-timing-of-time-zone-changes/ –

+0

我仍然收到不良结果。 @Maggie Pint,我已经在使用这个目的了。 – user1614862

相关问题