【问题标题】:convert date string to ISO date with timezone将日期字符串转换为带时区的 ISO 日期
【发布时间】:2017-05-31 15:43:35
【问题描述】:

我有一组日期和时间,格式如下:

01.07.2013 16:10

我知道我必须重新排列以匹配 ISO 标准,所以我最终得到了这样的字符串:

2013-07-01T16:10.

由此,我需要创建一个Date 对象。在这里阅读了很多关于此的问题后,我对如何为此添加时区感到有些困惑。所有时间都是纽约市当地时间,我也想在其中存储日期。

因此,由于 Javascript 从我的机器中获取时区,我将其更改为来自 NYC 的时区。但是,以下部分最让我困惑:

> print(new Date("2013-07-01T16:10"))
Mon Jul 01 2013 16:10:00 GMT+2000 (EDT)

问题:为什么我的当地时间是 GMT-0400(纽约的时间)时显示的是 GMT+2000?这个对吗'?如果没有,如何正确完成?

--更新: 我正在使用 mongoDB 3.4.4,解释器版本是 MozJS-38systemsetup -gettimezone 返回 America/New_York。在 chrome 中运行 mongo-express 显示:Mon Jul 01 2013 06:00:00 GMT+0200 (EDT) for ISODate("2013-07-01T04:00:00.000Z") 已存储,但 shell 显示 Tue Jul 02 2013 00:00:00 GMT+2000 (EDT) for print(new Date("2013-07-01T04:00:00.000Z"));

【问题讨论】:

  • 你确定它说的是"GMT+2000"吗?如果是这样,您机器的时区数据已损坏。世界上没有比格林威治标准时间早 20 小时的地方。此外,在这种格式下,纽约将是 "GMT-0400"。你确定你没有在这里输入零吗?
  • 是的,我确定。是的,我也希望它是"GMT-0400"。我使用的是 MacOS,更改时区后没有重新启动。也许这就是原因。
  • 好的,但是你写了 "GMT-4000",所以你把零放在了错误的位置。你确定你没有对"GMT+2000" 做同样的事情吗?你的意思是"GMT+0200"
  • 您不需要重新启动计算机,但您应该重新启动浏览器。你使用的是什么浏览器?您的时区在 MacOS 中设置为哪个特定条目? (终端使用sudo systemsetup -gettimezone查看)
  • 另外,print 在大多数浏览器中启动打印预览对话框,并且在 Node.js 中没有定义。你在什么环境下print 有效?通常是console.log

标签: javascript mongodb date datetime


【解决方案1】:

您在创建Date 对象时没有指定时区偏移量。

> new Date("2013-07-01T16:10-04:00")
2013-07-01T20:10:00.000Z

【讨论】:

  • 如果本地时区实际上在那个偏移量中,那么就不需要指定它。 ISO8601 和 ES2015+(所有现代浏览器)将不带偏移量的 ISO 日期+时间解释为本地时间。
  • 我没有意识到这一点。我的错。
  • 它在 ES6 中进行了更改以匹配 ISO8601。 ES 5.1 及更低版本将解释为 UTC。 Chrome 是最后一个实施的。
  • NYC 比 UTC 晚 4 小时,所以确实需要根据答案指定对吗?
  • @fritz - 不,如果当地时区比相关日期的 UTC 晚 4 小时,那么您不需要 需要 传递偏移量 - (除非您是试图消除 DST 回退转换中的值的歧义)
猜你喜欢
  • 2019-02-27
  • 2020-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
相关资源
最近更新 更多