我有一个区域图表,可以正确地解析工具提示的日期 - 除了2009年2月。
这是一个说明问题的Plunker:http://plnkr.co/edit/Yl4hUDVin2sZedu016Wm?p=preview
我认为,这是有问题的代码:
var mousex = d3.mouse(this);
mousex = mousex[0] ;//+ 3; //7
var invertedx = xScale.invert(mousex);
var invertedxmo = xScale.invert(mousex);
var invertedxyr = xScale.invert(mousex);
function getMonth(date) {
var month = date.getMonth() + 1;
return month < 10 ? '0' + month : '' + month;
}
invertedx = ("" + (invertedx.getMonth() + 1)).slice(-2) + '/' + invertedx.getFullYear();
var selected = (d.values);
for (var k = 0; k < selected.length; k++) {
dates[k] = selected[k].x
dates[k] = ("" + (dates[k].getMonth() + 1)).slice(-2) + '/' + dates[k].getFullYear();
}
invertedxmo = ("" + (invertedxmo.getMonth() + 1)).slice(-2) ;
var selectedmo = (d.values);
for (var m = 0; k < selectedmo.length; k++) {
dates[m] = selectedmo[m].x
dates[m] = ("" + (dates[m].getMonth() + 1)).slice(-2) ;
}
invertedxyr = invertedxyr.getFullYear();
mousedate = dates.indexOf(invertedx);
pro = d.values[mousedate].y
var monthNames = ["January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"
];
我尝试更改slice(-2)
,这解决了2009年2月的问题,但它也为解析每年的12月日期带来了新的问题。
有谁可以证明如何解决这个问题?
修改/更新:
有趣的是,当我通过将第16行从var startDate = d3.time.month.offset(new Date(), -108);
更改为var startDate = d3.time.month.offset(new Date(), -119);
来修改图表的日期范围时,2009年2月解析得很好 - 但是2008年2月引发了错误!同样,如果我通过将第16行的偏移值更改为-98
来缩小日期范围:2010年2月引发错误,但所有后续的Februaries都解析得很好,所有其他日期也是如此。 (显然,如果您使用滑块来缩小日期范围,则错误仍将仅发生在图表最初加载时,在移动滑块之前显示的第一个二月。)
因此,无论2008年,2009年,2010年的日期范围是否存在,所以看起来它总是在图表上的第一二月产生此错误。所有后续的二十月在第一个解析后就好了。
答案 0 :(得分:1)
鼠标悬停代码中的代码没有问题。问题出在 DATE
今天的日期是30日,您生成开始日期的方式是:
d3.time.month.offset(new Date(), -108);
即。它以Sun Nov 30 2008 16:46:58 GMT-0500 (EST)
开头,并按以下方式进行:
Sun Nov 30 2008 16:52:32 GMT-0500 (EST)
Tue Dec 30 2008 16:52:32 GMT-0500 (EST)
Fri Jan 30 2009 16:52:32 GMT-0500 (EST)
Mon Mar 02 2009 16:52:32 GMT-0500 (EST)
Thu Apr 02 2009 16:52:32 GMT-0400 (EDT)
.....
由于它无法在2009年2月找到第30名,它最终将于2009年3月2日开始,从那时开始,每个月的第2天都会被选中,这肯定会包括所有的Februarys。 (在createDatesArr
函数中)
一种方法将从该月的第一天开始。
相关代码:
var currentDate = new Date();
var firstDay = new Date(currentDate.getFullYear(), currentDate.getMonth(), 1);
var startDate = d3.time.month.offset(firstDay, -108);
更新了Plunkr
希望这会有所帮助。 :)