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

sam*_*wei 1 javascript syntax d3.js

var startDate = new Date('2013-05-13');
var date_format = d3.time.format("%m/%d");
Run Code Online (Sandbox Code Playgroud)

如果我做

startDate = date_format(startDate); 
Run Code Online (Sandbox Code Playgroud)

我得到"05/12"而不是"05/13".任何人都知道为什么会发生这种情况?

mbo*_*ock 5

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

> new Date("2013-05-13")
Sun May 12 2013 17:00:00 GMT-0700 (PDT)
Run Code Online (Sandbox Code Playgroud)

该字符串由Date构造在UTC时间解释,而返回的Date对象在本地时间.5月13日午夜UTC是5月12日下午5点PDT,因此当您使用d3.time.format在当地时间格式化时,您将在5月12日回来.

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

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