如何仅更改时区而不修改 momentz 中的时间
How to change only timezone without modifying the time in momentz
我有 2016-06-21T10:00:00-07:00 格式的日期和时间,在 PST 中表示 06/21/2016 5 PM,我只想将其更改为 06/21/2016 5在东部时间下午,反之亦然。我怎样才能用 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 (PST)
预期输出 = 2016-06-21T08:00:00-04:00 (EST)
因此,当我将其转换为 UTC 时,它应该变为
太平洋标准时间为 2016-06-22T15:00:00Z
美国东部时间 2016-06-22T12:00:00Z
结帐moment().utcOffset()
您可以将偏移量作为参数传递给此函数,日期将使用该语言环境。
假设您事先知道所需的 utcOffsets,在您的情况下是 -420 和 -240 或 -300(带夏令时的 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
编辑:此答案已发布到问题的早期版本,其中不同时区需要相同的时间。如果它不正确,请详细说明它是怎么回事。
谢谢!
我认为您对 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 中的 material,因为它涵盖了 ISO8601 格式的工作原理,以及所有 moment 的构造函数的工作原理。
我有 2016-06-21T10:00:00-07:00 格式的日期和时间,在 PST 中表示 06/21/2016 5 PM,我只想将其更改为 06/21/2016 5在东部时间下午,反之亦然。我怎样才能用 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 (PST)
预期输出 = 2016-06-21T08:00:00-04:00 (EST)
因此,当我将其转换为 UTC 时,它应该变为
太平洋标准时间为 2016-06-22T15:00:00Z 美国东部时间 2016-06-22T12:00:00Z
结帐moment().utcOffset()
您可以将偏移量作为参数传递给此函数,日期将使用该语言环境。
假设您事先知道所需的 utcOffsets,在您的情况下是 -420 和 -240 或 -300(带夏令时的 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
编辑:此答案已发布到问题的早期版本,其中不同时区需要相同的时间。如果它不正确,请详细说明它是怎么回事。 谢谢!
我认为您对 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 中的 material,因为它涵盖了 ISO8601 格式的工作原理,以及所有 moment 的构造函数的工作原理。