如何将 ISO 格式的日期时间转换为 UTC 时区?

V S*_* SH 0 javascript datetime utc iso8601 momentjs

我正在使用moment.js,并且我想从 ISO 格式日期时间转换为 UTC 时区。

我可以从本地时间转换为 UTC+ISO 格式,但无法将 ISO 格式转换为 UTC 时区。

输入:

2018-03-22T00:00:00Z
Run Code Online (Sandbox Code Playgroud)

预期输出:

日期应采用 UTC 时区。如果我计算的话应该是:

22018-03-21T18:30:00Z
Run Code Online (Sandbox Code Playgroud)
  1. 首先我想转换为 ISO,然后转换为 UTC**。

无法将本地日期时间转换为 ISO,然后转换为 UTC

我们可以转换成字符串,但是ISO格式可以转换吗?

Fox 示例: 我想转换ISODATE(2018-03-22T00:00:00Z)为 UTC 时区。

function toISO(dt) {
  return moment(dt).format("YYYY-MM-DDTHH:mm:ss") + "Z";
}
var date = new Date();
var isoDate= toISO(date)
Run Code Online (Sandbox Code Playgroud)

直接我们就可以转换

function toISOWithUtc(dt) {
      return moment(dt).utc().format("YYYY-MM-DDTHH:mm:ss") + "Z";
}
var date = new Date();
toISO(date)
Run Code Online (Sandbox Code Playgroud)

pis*_*ist 5

2018-03-22T00:00:00Z和均已2018-03-21T18:30:00Z 处于 UTC 时间

注意Z到底?这意味着日期采用 UTC 格式。它不是一个可以直接附加到末尾的硬编码字母 - 它具有特定的含义,它表明日期/时间采用 UTC。

如果您想将该 UTC 日期转换为另一个时区(我猜这就是您想要的),您可以使用moment.tz

// convert UTC 2018-03-22T00:00:00Z to Asia/Kolkata timezone
moment.tz('2018-03-22T00:00:00Z','Asia/Kolkata')
Run Code Online (Sandbox Code Playgroud)

只需将时区名称更改为您要转换的时区名称即可。

调用format()将为您提供 ISO8601 格式的转换后的日期/时间:

moment.tz('2018-03-22T00:00:00Z','Asia/Kolkata').format() // 2018-03-22T05:30:00+05:30
Run Code Online (Sandbox Code Playgroud)

请注意,偏移量从 更改Z+05:30。这意味着上面的日期/时间比 UTC 早 5 小时 30 分钟,这是转换2018-03-22T00:00:00Z为加尔各答时区的结果。

注意:我认为您误解了这里的概念。

UTC 是一种时间标准。它定义了世界各地的当前日期/时间等内容,它使用原子钟来确保地球上的每个人都是同步的,并且时区都基于 UTC 的偏移量

ISO8601 是交换日期/时间相关数据的标准。它定义格式(日期的文本表示)。日期/时间可以采用 ISO 格式,无论是否采用 UTC

这就是为什么“从 UTC 转换为 ISO”(反之亦然)根本没有意义。