首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >d3图表的工具提示未能正确解析2009年2月

d3图表的工具提示未能正确解析2009年2月
EN

Stack Overflow用户
提问于 2017-11-30 16:13:01
回答 1查看 46关注 0票数 1

我有一个区域图表,正确地分析了工具提示的日期--除非是在2009年2月。

下面是一个演示问题的柱塞:http://plnkr.co/edit/Yl4hUDVin2sZedu016Wm?p=preview

我认为,以下是有问题的代码:

代码语言:javascript
运行
复制
  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月会抛出一个错误,但是后续的所有二月都解析得很好,所有其他日期也一样。(显然,如果使用滑块缩小日期范围,则错误仍将仅发生在最初加载图表时,即移动滑块之前的2月1日。)

因此,似乎总是在图表上的第一2月产生这一错误,无论日期范围存在于2008年、2009年、2010年等。第一次之后的所有2月都被解析得很好。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-30 22:01:57

在mouseover代码中的代码没有问题。问题在DATE中。

今天的日期是30日,您生成开始日期的方式是:

代码语言:javascript
运行
复制
d3.time.month.offset(new Date(), -108);

也就是说,它从Sun Nov 30 2008 16:46:58 GMT-0500 (EST)开始,并按以下方式进行:

代码语言:javascript
运行
复制
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日上市,从那以后,每个月的第二天都会被选中,这肯定会包括所有的二月。(在createDatesArr函数中)

的一种方法是从本月的第一天开始。

相关代码:

代码语言:javascript
运行
复制
var currentDate = new Date();
var firstDay = new Date(currentDate.getFullYear(), currentDate.getMonth(), 1);
var startDate = d3.time.month.offset(firstDay, -108);

更新的普朗克

希望这能有所帮助。:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47577822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档