d3.time.scale
有一个整洁的时间格式化程序,使用multi-scale time formats。是否有API或其他方式(尚)指定multi-scale time formats?
我知道可以创建一个新的d3.time.format
,但这不会是多尺度的。
感谢。
答案 0 :(得分:10)
多尺度时间格式不会作为d3.time.scale的tickFormat方法返回的标准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);
}