date对象在使用D3.time.format进行解析时返回不同的日期

date object returns different date when parsing using D3.time.format

本文关键字:返回 日期 对象 D3 format time date      更新时间:2023-09-26
var startDate = new Date('2013-05-13');
var date_format = d3.time.format("%m/%d");

如果我这样做

startDate = date_format(startDate); 

我得到"05/12"而不是"05/13"。有人知道为什么会这样吗?

不要使用Date(string)构造函数来解析日期;它因浏览器而异。"2013-05-13"最可能(但不能保证)的解释是作为UTC时间的ISO8601字符串。因此,如果在JavaScript控制台中运行语句,您将看到:

> new Date("2013-05-13")
Sun May 12 2013 17:00:00 GMT-0700 (PDT)

该字符串由Date构造解释为UTC时间,而返回的Date对象是本地时间。UTC时间5月13日午夜是PDT时间5月12日下午5点,所以当你使用d3.time将其格式化为当地时间时。格式,你得到5月12日。

您可以切换到使用d3.time.format.utc("%m/%d")来格式化您的日期,但这样您仍然依赖于date (string)构造函数的模糊行为。所以,与其…

正如@minikomi所建议的,您可以创建d3.time。格式解析日期字符串:d3.time.format("%Y-%m-%d"),然后是format.parse("2013-05-13")。或者您可以使用多参数Date构造函数:new Date(2013, 4, 13),但是注意月份从0开始,而不是通常的0。

使用d3.time可能会得到更一致的结果。格式化以解析字符串:

  var startDate = '2013-05-13';
  var parser = d3.time.format("%Y-%m-%d");
  var formatter = d3.time.format("%m/%d");
  var startDateString = formatter(parser.parse(startDate));