D3 DateTime 解析器考虑了时区

D3 DateTime parser takes into account timezone

我有这个 URL,我需要解析 mydate 时间戳并将其转换为 UTC 日期时间(在 Javascript 中)。

http://www.blablabla.com/#mydate=2009-10-12T22:09:28.000

显然 URL 中编码的日期只是字符串,因此它不传达任何时区信息:但是它代表 UTC 时间。

将 UTC 时间戳字符串转换为 UTC 日期时间似乎非常简单,但我遇到了这个问题:

我正在使用 D3 时间解析器来做,这里是重要的一点:

var iso = d3.time.format.utc("%Y-%m-%dT%H:%M:%S.%L");
var dateObj = iso.parse(mydate);

mydate 是一个字符串,它只是包含时间戳位的 URL 的剪辑版本:

2009-10-12T22:09:28.000

.parse函数的输出是:

 Mon Oct 12 2009 23:09:28 GMT+0100 (GMT Daylight Time)

我早有预料(这就是我想要的):

Mon Oct 12 2009 22:09:28

OS 和浏览器设置为 UTC 时间(这里我们目前是 GMT)。 那么为什么我得到的是 (GMT Daylight Time) 部分而不是普通的 UTC 字符串?

编辑

即使使用简单的 new Date(2009, 9, 12, 22, 09, 28) 我也会遇到同样的问题(没有 D3,没有 MomentJS,只有一个普通的 JavaScript DateTime 对象)

值 "GMT+0100 (GMT Daylight Time)" 是 Windows 的有趣说法 "British Summer Time"(或 BST)。 In 2009, BST ran from March 29 to October 25,因此您的 10 月 12 日在该范围内。

您的时区未设置为 "(UTC) Coordinated Universal Time",设置为 "(UTC) Dublin, Edinburgh, Lisbon, London"。括号中的值仅表示 标准 偏移量。它不反映夏令时。

最后,输出实际上是一个Date对象,而不是字符串。 JavaScript Date 对象根据 运行 所在计算机的时区,根据 当地时间 显示其大部分输出。如果你想要 UTC 时间,那么你可以使用 .toISOString() 而不是 .toString(),尽管那将是 ISO 8601 扩展格式,而不是人类可读的格式。

如果您想要一种人类可读的基于 UTC 的格式,因为您已经在使用 D3,请执行如下操作:

var iso = d3.time.format.utc("%Y-%m-%dT%H:%M:%S.%L");
var dateObj = iso.parse(mydate);

var fmt = d3.time.format.utc("%c"); // or whatever format you wish
var str = fmt.format(dateObj);

详情请参阅D3's time formatting documentation