d3中的自定义多尺度时间格式

时间:2012-08-03 18:25:58

标签: d3.js

d3.time.scale有一个整洁的时间格式化程序,使用multi-scale time formats。是否有API或其他方式(尚)指定multi-scale time formats

我知道可以创建一个新的d3.time.format,但这不会是多尺度的。

感谢。

2 个答案:

答案 0 :(得分:10)

多尺度时间格式不会作为d3.time.scaletickFormat方法返回的标准API之外的公共API公开。

尽管如此,implementation itself相当简单,因此您可以创建自己的多尺度时间格式而无需大量工作。多尺度时间格式只是time formats的有序数组,每个数组都有一个相关的测试函数。返回true的第一个测试函数确定使用哪种时间格式。

d3.time.scale使用的时间格式具有以下格式(取自time/scale.js),以相反的顺序指定:

  [".%L", function(d) { return d.getMilliseconds(); }],
  [":%S", function(d) { return d.getSeconds(); }],
  ["%I:%M", function(d) { return d.getMinutes(); }],
  ["%I %p", function(d) { return d.getHours(); }],
  ["%a %d", function(d) { return d.getDay() && d.getDate() != 1; }],
  ["%b %d", function(d) { return d.getDate() != 1; }],
  ["%B", function(d) { return d.getMonth(); }],
  ["%Y", d3_true]

因此,例如,如果时间具有非零毫秒字段,则使用“。%L”格式;否则,如果它具有非零秒字段,则使用“:%S”;等等。

答案 1 :(得分:2)

在d3版本4中,d3.time.format已更改。这是创建条件时间格式化程序的新版本:

https://github.com/d3/d3-time-format#d3-time-format

var formatMillisecond = d3.timeFormat(".%L"),
    formatSecond = d3.timeFormat(":%S"),
    formatMinute = d3.timeFormat("%I:%M"),
    formatHour = d3.timeFormat("%I %p"),
    formatDay = d3.timeFormat("%a %d"),
    formatWeek = d3.timeFormat("%b %d"),
    formatMonth = d3.timeFormat("%B"),
    formatYear = d3.timeFormat("%Y");

function multiFormat(date) {
  return (d3.timeSecond(date) < date ? formatMillisecond
      : d3.timeMinute(date) < date ? formatSecond
      : d3.timeHour(date) < date ? formatMinute
      : d3.timeDay(date) < date ? formatHour
      : d3.timeMonth(date) < date ? (d3.timeWeek(date) < date ? formatDay : formatWeek)
      : d3.timeYear(date) < date ? formatMonth
      : formatYear)(date);
}