我有2016-06-21T10:00:00-07:00格式的日期和时间,它代表06/21/2016 5 PM在太平洋标准时间,我只想将其更改为06/21/2016 5 PM in EST,反之亦然。我怎么能用momentz做到这一点?
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
答案 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
编辑:这个答案被发布到问题的早期版本,其中在不同的时区需要相同的时间。如果不正确,请详细说明它是怎样的。 谢谢!