d3-time

当可视化时间序列数据,分析时间模式,或者总的来说需要与时间协作的时候,常规时间单位的不规则性迅速变得明显。例如,在Gregorian calendar(阳历中),大多数月份有31天,而有些月有28, 29或30天;大多数年份有365天, leap years(闰年)有366天;在daylight saving(夏令时)中,一天大多数为24小时,而有些为23或25小时。再加上各种复杂情况,夏令时在世界各地各不相同。

由于这些时间的怪异性,很难执行看似简单的任务。例如,如果你想计算两个日期之间相差的天数,你不能简单地相减,然后除以24小时(86,400,000毫秒):

var start = new Date(2015, 02, 01), // Sun Mar 01 2015 00:00:00 GMT-0800 (PST)
    end = new Date(2015, 03, 01); // Wed Apr 01 2015 00:00:00 GMT-0700 (PDT)
(end - start) / 864e5; // 30.958333333333332, oops!

但是,你可以使用d3.timeDay.count:

d3.timeDay.count(start, end); // 31

interval是d3-time提供的功能之一。每个间隔代表一个常规的时间单位—hours(小时)、weeks(周)、months(月)等,并有计算边界日期的方法。例如,d3.timeday计算对应天的midnight (午夜)(通常为当地时间12:00 AM)。除了rounding和和counting之外,intervals还可以用来生成边界日期数组。例如,计算当前月份的每个星期日:

var now = new Date;
d3.timeWeek.range(d3.timeMonth.floor(now), d3.timeMonth.ceil(now));
// [Sun Jun 07 2015 00:00:00 GMT-0700 (PDT),
//  Sun Jun 14 2015 00:00:00 GMT-0700 (PDT),
//  Sun Jun 21 2015 00:00:00 GMT-0700 (PDT),
//  Sun Jun 28 2015 00:00:00 GMT-0700 (PDT)]

d3-time模块并没有实现自己的日历系统;它只是在ECMAScript Date上实现了便利的API。因此,它忽略了闰秒,而且只能与本地时区和Coordinated Universal Time(UTC)(世界标准时间)一起工作。

此模块被D3的时间比例尺用于生成刻度,也可以直接用来做calendar layouts(日历布局)

Installing

如果你使用npm,请键入npm install d3-time。否则,请下载最新版本。你也可以直接从d3js.org加载,作为standalone library(独立库)或D3 4.0的一部分来使用。支持AMD,CommonJS和vanilla环境。在vanilla环境下,会输出一个全局的d3

<script src="https://d3js.org/d3-time.v1.min.js"></script>
<script>

var day = d3.timeDay(new Date);

</script>

API Reference

interval(date)

interval.floor的别名。例如,d3.timeYear(date)和d3.timeYear.floor(date)是等价的。

interval.floor(date)

返回表示在给定date之前或等于给定date的最近的区间边界日期。例如,d3.timeDay.floor(date)通常返回给定date当地时间的上午12:00。

此方法为幂等:如果给定date已经在当前区间,则返回一个相同时间的新日期。此外,返回的日期是相关间隔的最小可表现值,因此interval.floor(interval.floor(date) - 1) 返回区间边界日期的前一个值。

注意:=====不会用Date对象的值进行比较,因此你可以用它们来区分给定的date是否已经向下取整了。相反,强制转换为数字再进行比较:

// Returns true if the specified date is a day boundary.
function isDay(date) {
  return +d3.timeDay.floor(date) === +date;
}

这比测试时间是否是上午12:00更可靠,因为在某些时区,由于夏令时,午夜可能不存在。

interval.round(date)

返回表示离date最近的区间边界日期。例如,如果是在中午或中午以前,d3.timeDay.round(date)通常返回给定date当地时间的上午12:00,否则返回第二天的上午12:00。

此方法为幂等:如果给定date已经在当前区间,则返回一个相同时间的新日期。

interval.ceil(date)

返回表示在给定date之后或等于给定date的最早区间边界日期。例如,d3.timeDay.ceil(date)通常返回给定date当地时间之后的上午12:00。

此方法为幂等:如果给定date已经在当前区间内最大,则返回一个相同时间的新日期。此外,返回的日期是相关区间的最大可表现值,因此interval.ceil(interval.ceil(date) + 1) 返回区间边界日期的后一个值。

interval.offset(date[, step])

返回一个新日期,等于date加上step。如果不指定step,则默认为1;如果step为负值,则返回的日期将在给定date之前;如果step为0,则返回给定date的副本;如果step不为整数,将向下取整。此方法不会将给定date舍入到区间中。例如,如果date为今天下午5:34,d3.timeDay.offset(date, 1)将返回明天下午5:34(即使夏令时改变!)。

interval.range(start, stop[, step])

返回一个日期数组,表示每个区间边界都在start之后(包含),end之前(不包含)。如果指定了step,则返回每个第step处的边界;例如,对于d3.timeDaystep为2时将每隔一天返回。如果step不为整数,将向下取整

返回数组中的第一个日期是等于start或在start之后最早的边界;随后的日期将按step偏移并向下取整。因此,两个重叠的范围可能是连续的。例如,此范围包含奇数天:

d3.timeDay.range(new Date(2015, 0, 1), new Date(2015, 0, 7), 2);
// [Thu Jan 01 2015 00:00:00 GMT-0800 (PST),
//  Sat Jan 03 2015 00:00:00 GMT-0800 (PST),
//  Mon Jan 05 2015 00:00:00 GMT-0800 (PST)]

而此范围包含偶数天:

d3.timeDay.range(new Date(2015, 0, 2), new Date(2015, 0, 8), 2);
// [Fri Jan 02 2015 00:00:00 GMT-0800 (PST),
//  Sun Jan 04 2015 00:00:00 GMT-0800 (PST),
//  Tue Jan 06 2015 00:00:00 GMT-0800 (PST)]

当给定step后想保持范围连续,请使用interval.every

interval.filter(test)

用给定函数返回一个新的区间,该区间为当前区间的子集。test函数将被传入一个日期,当且仅当给定日期为该区间的一部分时才返回true。例如,创建一个区间,返回每个月的第一天、第十一天、第二十一天和第三十一天(如果存在):

var i = d3.timeDay.filter(function(d) { return (d.getDate() - 1) % 10 === 0; });

返回的区间不支持interval.count。另请参阅interval.every

interval.every(step)

返回此区间的一个过滤后的view,表示每第step个日期。step的意义取决于此区间的父区间,由field函数定义。例如,d3.timeMinute.every(15)返回一个区间,表示每隔15分钟,小时的:00,:15,:30,:45等。注意:对于一些区间,返回的日期可能不均匀;d3.timeDay的父区间为d3.timeMonth,从而区间数将在每个月的开始重置。如果step无效,则返回null。如果step为1,则返回此interval。

此方法可以结合interval.range使用以确保两个重叠的范围是连续的。例如,此范围包含奇数天:

d3.timeDay.every(2).range(new Date(2015, 0, 1), new Date(2015, 0, 7));
// [Thu Jan 01 2015 00:00:00 GMT-0800 (PST),
//  Sat Jan 03 2015 00:00:00 GMT-0800 (PST),
//  Mon Jan 05 2015 00:00:00 GMT-0800 (PST)]

这个也一样:

d3.timeDay.every(2).range(new Date(2015, 0, 2), new Date(2015, 0, 8));
// [Sat Jan 03 2015 00:00:00 GMT-0800 (PST),
//  Mon Jan 05 2015 00:00:00 GMT-0800 (PST),
//  Wed Jan 07 2015 00:00:00 GMT-0800 (PST)]

返回的过滤后的区间不支持interval.count。另请参阅interval.filter

interval.count(start, end)

返回start(不包含)之后,end之前(包含)的区间边界数。注意,此方法和interval.range略有不用,因为它的目的是返回给定end日期相对于给定start日期的从0开始的数量。例如,计算当前从0开始的一年之中的天数:

var now = new Date;
d3.timeDay.count(d3.timeYear(now), now); // 177

同样,计算当前以星期日为起点的一年之中的周数:

d3.timeSunday.count(d3.timeYear(now), now); // 25

d3.timeInterval(floor, offset[, count[, field]])

根据给定 floor函数和offset函数及可选的count函数构造一个新的自定义区间。

floor函数以单个日期作为参数,并向下取整到最近区间边界。

offset函数以一个日期和一个整数step作为参数,并根据边界数将给定日期向前推进;step可以为正、负或0。

可选的count函数以一个开始日期和一个结束日期作为参数,已经舍入到当前区间,并返回start(不包含)和end(包含)间的边界数。如果不指定count函数,则返回的区间不会公开interval.countinterval.every方法。注意:由于内部优化,给定count函数不能调用其他的时间间隔的interval.count。

可选的field函数以一个日期作为参数,已经舍入到当前区间,并返回给定日期的字段值,对应此date(不包含)和最近前父边界之间的边界数。例如,对于d3.timeDay区间,将返回一个月的天数。如果不指定field函数,则默认从1970年1月1日UTC UNIX时期起计算区间边界的数量。field函数定义了interval.every的行为。

Intervals

提供下列区间:

d3.timeMillisecond

d3.utcMillisecond

毫秒;最短可用时间单位。

d3.timeSecond

d3.utcSecond

秒(例如,01:23:45.0000 AM);1000毫秒。

d3.timeMinute

d3.utcMinute

分钟(例如。01:02:00 AM);60秒。注意,ECMAScript忽略了leap seconds(闰秒)

d3.timeHour

d3.utcHour

小时(例如,01:00 AM);60分钟。注意,因为夏令时的缘故,在当地时间提前一个小时可能返回同一个小时或跳过一个小时。

d3.timeDay

d3.utcDay

天(例如,2012年2月7日上午12:00);通常为24小时制。因为夏令时的缘故,在当地时间中,一天可能为23至25小时。

d3.timeWeek

d3.utcWeek

d3.timeSunday的别名;通常为7天或168小时。因为夏令时的缘故,在当地时间中,一周可能为167至169小时。

d3.timeSunday

d3.utcSunday

以星期日为起点的周(例如,2012年2月5日上午12点)。

d3.timeMonday

d3.utcMonday

以星期一为起点的周(例如,2012年2月6日上午12点)。

d3.timeTuesday

d3.utcTuesday

以星期二为起点的周(例如,2012年2月7日上午12点)。

d3.timeWednesday

d3.utcWednesday

以星期三为起点的周(例如,2012年2月8日上午12点)。

d3.timeThursday

d3.utcThursday

以星期四为起点的周(例如,2012年2月9日上午12点)。

d3.timeFriday

d3.utcFriday

以星期五为起点的周(例如,2012年2月10日上午12点)。

d3.timeSaturday

d3.utcSaturday

以星期六为起点的周(例如,2012年2月11日上午12点)。

d3.timeMonth

d3.utcMonth

月(例如,2012年2月1日上午12点);范围从28到31天。

d3.timeYear

d3.utcYear

年(例如,2012年1月1日12点);从365天到366天不等。

Ranges

为方便起见,别名interval.range也提供相应区间的复数形式。

d3.timeMilliseconds(start, stop[, step])

d3.utcMilliseconds(start, stop[, step])

d3.timemillisecond.ranged3.utcmillisecond.range的别名。

d3.timeSeconds(start, stop[, step])

d3.utcSeconds(start, stop[, step])

d3.timesecond.ranged3.utcsecond.range的别名。

d3.timeMinutes(start, stop[, step])

d3.utcMinutes(start, stop[, step])

d3.timeminute.ranged3.utcminute.range的别名。

d3.timeHours(start, stop[, step])

d3.utcHours(start, stop[, step])

d3.timeHour.ranged3.utcHour.range的别名。

d3.timeDays(start, stop[, step])

d3.utcDays(start, stop[, step])

d3.timeday.ranged3.utcday.range的别名。

d3.timeWeeks(start, stop[, step])

d3.utcWeeks(start, stop[, step])

d3.timeweek.ranged3.utcweek.range的别名。

d3.timeSundays(start, stop[, step])

d3.utcSundays(start, stop[, step])

d3.timesunday.ranged3.utcsunday.range的别名。

d3.timeMondays(start, stop[, step])

d3.utcMondays(start, stop[, step])

d3.timemonday.ranged3.utcmonday.range的别名。

d3.timeTuesdays(start, stop[, step])

d3.utcTuesdays(start, stop[, step])

d3.timetuesday.ranged3.utctuesday.range的别名。

d3.timeWednesdays(start, stop[, step])

d3.utcWednesdays(start, stop[, step])

d3.timewednesday.ranged3.utcwednesday.range的别名。

d3.timeThursdays(start, stop[, step])

d3.utcThursdays(start, stop[, step])

d3.timethursday.ranged3.utcthursday.range的别名。

d3.timeFridays(start, stop[, step])

d3.utcFridays(start, stop[, step])

d3.timefriday.ranged3.utcfriday.range的别名。

d3.timeSaturdays(start, stop[, step])

d3.utcSaturdays(start, stop[, step])

d3.timesaturday.ranged3.utcsaturday.range的别名。

d3.timeMonths(start, stop[, step])

d3.utcMonths(start, stop[, step])

d3.timemonth.ranged3.utcmonth.range的别名。

d3.timeYears(start, stop[, step])

d3.utcYears(start, stop[, step])

d3.timeyear.ranged3.utcyear.range的别名。

results matching ""

    No results matching ""