Datetime d3.js日期时间:小时未在y轴上正确显示

Datetime d3.js日期时间:小时未在y轴上正确显示,datetime,d3.js,Datetime,D3.js,使用d3.js v4,我试图在y轴上绘制时间图。y轴表示时钟的24小时 数据很简单 [{ "start": "2016-11-14 20:00", "end": "2016-11-14 23:59" }, { "start": "2016-11-16 01:00", "end": "2016-11-16 03:00" }, { "start": "2016-11-15 00:00", "end": "2016-11-15 04:00

使用d3.js v4,我试图在y轴上绘制时间图。y轴表示时钟的24小时

数据很简单

[{
    "start": "2016-11-14 20:00",
    "end": "2016-11-14 23:59"
  },
  {
    "start": "2016-11-16 01:00",
    "end": "2016-11-16 03:00"
  },
  {
    "start": "2016-11-15 00:00",
    "end": "2016-11-15 04:00"
  }
]
第一个对象应该是从20到24的图形,但它是从19到23的。这可能会导致一个问题,例如基于零的计数

有人对我如何解决这个问题有什么建议吗

这是完整的代码片段

d3日期时间图 -> var svg=d3.selectsvg, 保证金={ 前20名, 右:60, 底数:60, 左:40 }, 宽度=+svg.attrwidth-margin.left-margin.right, 高度=+svg.attrheight-margin.top-margin.bottom; 变量颜色=[2C93E8、838690、F56C4E、A60F2B、648C85、B3F2C9、528C18、C3F25C]; 风险值数据=[{ 开始时间:2016-11-14 20:00, 完:2016-11-14 23:59 }, { 开始时间:2016-11-16 01:00, 完:2016-11-16 03:00 }, { 开始时间:2016-11-15 00:00, 完:2016-11-15 04:00 } ] var parseTime=d3。时间分析%Y-%m-%d%H:%m; var parseDay=d3。时间解析%e%b%Y; var formatDay=d3。时间格式%e%b%Y; //data.foreachd函数{ //开始=parseTimed.start; //consult=parseTimed.end; //如果开始.getDay!=结束.getDay{ ////这里有一张支票,以防他们相隔一天以上 // // 2016-11-04 12:00 // //上午=consult.getFullYear+-+consult.getMonth+1+-+consult.getDate+00:00; //console.logmorning是+morning; //数据推送{ //开始:早上好, //完:d // } //午夜=开始.getFullYear+-+开始.getMonth+1+-+开始.getDate+23:59; //console.logmidnight是+midnight; //d.结束=午夜; ////我们需要删除当前对象 ////它是数组中的哪个元素,读取'i' ////使用slice删除该元素数据。slicei、1或类似的soemthing // } // }; console.logJSON.stringifydata,null,2; data.foreachd函数{ d、 start=parseTimed.start; d、 end=parseTimed.end; d、 duration=d.end-d.start/60*1000/60;//会话持续时间(小时) d、 starttime=d.start.getHours; d、 endtime=d.end.getHours; d、 每日=formatDayd.start; d、 day=parseDayd.daily; 返回d; }, 函数错误、数据错误{ 如果错误抛出错误; }; document.getElementByIdjson.innerHTML=data.json+; 变量x=d3.scaleTime .domaind3.extentdata,函数d{ return d.day;//每天需要轮换 } .范围[0,宽度]; 变量y=d3.scaleLinear .domain[0,24] .范围[高度,0]; var group=svg.appendg; group.selectAll.bar .数据 进来 .appendrect .stylefill,蓝色 .职业,酒吧 .attrtransform,translate80,0 .attrx,函数d{ 返回xd.day+10; } .attry,函数d{ //如果d.endtime+d.duration>24{ //console.logoh编号: //console.logd.starttime:+d.starttime;//2 //console.logyd.starttime:+yd.starttime;//293.3333 //console.logd.endtime:+d.endtime;//18 //console.logyd.endtime:+yd.endtime;//80 //console.logd.duration:+d.duration;//16 //console.logyd.duration:+yd.duration;//106.6666 //console.logheight:+height;//320 //console.logy16:+y16;//106.6666 //console.logy24:+y24;//0 //console.logy0:+y0;//320 //console.logheight-yd.duration:+height-yd.duration;//320-106.666=213.333 // } 返回yd.endtime; } .宽度,20 .attr高度,功能{ 返回高度-码持续时间; //返回yd.starttime; } .stylefill,函数,i{ 返回颜色[i]; }; svg.appendg .attrclass,轴-x .ATRTransform,translate100,+高度+2+ .calld3.axisBottomx.ticksd3.timeDay.every1.tickFormatd3.timeFormat%e%b%Y //axis.ticksd3.timeMinute.every15; //.calld3.x 。选择全部文本 .styletext锚定,结束 .attrdx,-.8em .attrdy,.15em .attr变换,旋转-35; svg.appendg .attrclass,y轴 .attrtransform,translate80,0 .call3.axisLefty.ticks24 .附录文本 .attransform,旋转-90 .attry,0 .attrx,0 .attrdy,0.71em .attr文本锚定,结束 .TEXT持续时间小时;
因此,第一个条,即您遇到问题的条,基于以下数据:

d.endtime = d.end.getHours();
你是根据它的结束时间来定位它的,它是这样导出的

所以,这就是问题所在:如果你得到的是23:59的小时,那么它是23,而不是24:JavaScript不舍入到最近的小时,它只取小时部分。如果你想更准确 在y轴上,您可以:

使用非小时的东西,如分钟或秒。 为每个条形图创建一个时间刻度,其域在条形图时间范围之前/之后设置为午夜。
d.endtime = d.end.getHours();