• Stars
    star
    227
  • Rank 169,370 (Top 4 %)
  • Language
    JavaScript
  • License
    ISC License
  • Created almost 9 years ago
  • Updated 6 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A calculator for humanity’s peculiar conventions of time.

d3-time

When visualizing time series data, analyzing temporal patterns, or working with time in general, the irregularities of conventional time units quickly become apparent. In the Gregorian calendar, for example, most months have 31 days but some have 28, 29 or 30; most years have 365 days but leap years have 366; and with daylight saving, most days have 24 hours but some have 23 or 25. Adding to complexity, daylight saving conventions vary around the world.

As a result of these temporal peculiarities, it can be difficult to perform seemingly-trivial tasks. For example, if you want to compute the number of days that have passed between two dates, you can’t simply subtract and divide by 24 hours (86,400,000 ms):

start = new Date(2015, 02, 01) // 2015-03-01T00:00
end = new Date(2015, 03, 01) // 2015-04-01T00:00
(end - start) / 864e5 // 30.958333333333332, oops! 🤯

You can, however, use d3.timeDay.count:

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

The day interval is one of several provided by d3-time. Each interval represents a conventional unit of time—hours, weeks, months, etc.—and has methods to calculate boundary dates. For example, d3.timeDay computes midnight (typically 12:00 AM local time) of the corresponding day. In addition to rounding and counting, intervals can also be used to generate arrays of boundary dates. For example, to compute each Sunday in the current month:

start = d3.timeMonth.floor() // 2015-01-01T00:00
stop = d3.timeMonth.ceil() // 2015-02-01T00:00
d3.timeWeek.range(start, stop) // [2015-01-07T00:00, 2015-01-14T00:00, 2015-01-21T00:00, 2015-01-28T00:00]

The d3-time module does not implement its own calendaring system; it merely implements a convenient API for calendar math on top of ECMAScript Date. Thus, it ignores leap seconds and can only work with the local time zone and Coordinated Universal Time (UTC).

This module is used by D3’s time scales to generate sensible ticks, by D3’s time format, and can also be used directly to do things like calendar layouts.

Installing

If you use npm, npm install d3-time. You can also download the latest release on GitHub. For vanilla HTML in modern browsers, import d3-time from Skypack:

<script type="module">

import {timeDay} from "https://cdn.skypack.dev/d3-time@3";

const day = timeDay();

</script>

For legacy environments, you can load d3-time’s UMD bundle from an npm-based CDN such as jsDelivr; a d3 global is exported:

<script src="https://cdn.jsdelivr.net/npm/d3-array@3"></script>
<script src="https://cdn.jsdelivr.net/npm/d3-time@3"></script>
<script>

const day = d3.timeDay();

</script>

Try d3-time in your browser.

API Reference

# interval([date]) · Source

Equivalent to interval.floor, except if date is not specified, it defaults to the current time. For example, d3.timeYear(date) and d3.timeYear.floor(date) are equivalent.

monday = d3.timeMonday() // the latest preceeding Monday, local time

# interval.floor(date) · Source

Returns a new date representing the latest interval boundary date before or equal to date. For example, d3.timeDay.floor(date) typically returns 12:00 AM local time on the given date.

This method is idempotent: if the specified date is already floored to the current interval, a new date with an identical time is returned. Furthermore, the returned date is the minimum expressible value of the associated interval, such that interval.floor(interval.floor(date) - 1) returns the preceeding interval boundary date.

Note that the == and === operators do not compare by value with Date objects, and thus you cannot use them to tell whether the specified date has already been floored. Instead, coerce to a number and then compare:

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

This is more reliable than testing whether the time is 12:00 AM, as in some time zones midnight may not exist due to daylight saving.

# interval.round(date) · Source

Returns a new date representing the closest interval boundary date to date. For example, d3.timeDay.round(date) typically returns 12:00 AM local time on the given date if it is on or before noon, and 12:00 AM of the following day if it is after noon.

This method is idempotent: if the specified date is already rounded to the current interval, a new date with an identical time is returned.

# interval.ceil(date) · Source

Returns a new date representing the earliest interval boundary date after or equal to date. For example, d3.timeDay.ceil(date) typically returns 12:00 AM local time on the date following the given date.

This method is idempotent: if the specified date is already ceilinged to the current interval, a new date with an identical time is returned. Furthermore, the returned date is the maximum expressible value of the associated interval, such that interval.ceil(interval.ceil(date) + 1) returns the following interval boundary date.

# interval.offset(date[, step]) · Source

Returns a new date equal to date plus step intervals. If step is not specified it defaults to 1. If step is negative, then the returned date will be before the specified date; if step is zero, then a copy of the specified date is returned; if step is not an integer, it is floored. This method does not round the specified date to the interval. For example, if date is today at 5:34 PM, then d3.timeDay.offset(date, 1) returns 5:34 PM tomorrow (even if daylight saving changes!).

# interval.range(start, stop[, step]) · Source

Returns an array of dates representing every interval boundary after or equal to start (inclusive) and before stop (exclusive). If step is specified, then every stepth boundary will be returned; for example, for the d3.timeDay interval a step of 2 will return every other day. If step is not an integer, it is floored.

The first date in the returned array is the earliest boundary after or equal to start; subsequent dates are offset by step intervals and floored. Thus, two overlapping ranges may be consistent. For example, this range contains odd days:

d3.timeDay.range(new Date(2015, 0, 1), new Date(2015, 0, 7), 2) // [2015-01-01T00:00, 2015-01-03T00:00, 2015-01-05T00:00]

While this contains even days:

d3.timeDay.range(new Date(2015, 0, 2), new Date(2015, 0, 8), 2) // [2015-01-02T00:00, 2015-01-04T00:00, 2015-01-06T00:00]

To make ranges consistent when a step is specified, use interval.every instead.

# interval.filter(test) · Source

Returns a new interval that is a filtered subset of this interval using the specified test function. The test function is passed a date and should return true if and only if the specified date should be considered part of the interval. For example, to create an interval that returns the 1st, 11th, 21th and 31th (if it exists) of each month:

d3.timeDay.filter(d => (d.getDate() - 1) % 10 === 0)

The returned filtered interval does not support interval.count. See also interval.every.

# interval.every(step) · Source

Returns a filtered view of this interval representing every stepth date. The meaning of step is dependent on this interval’s parent interval as defined by the field function. For example, d3.timeMinute.every(15) returns an interval representing every fifteen minutes, starting on the hour: :00, :15, :30, :45, etc. Note that for some intervals, the resulting dates may not be uniformly-spaced; d3.timeDay’s parent interval is d3.timeMonth, and thus the interval number resets at the start of each month. If step is not valid, returns null. If step is one, returns this interval.

This method can be used in conjunction with interval.range to ensure that two overlapping ranges are consistent. For example, this range contains odd days:

d3.timeDay.every(2).range(new Date(2015, 0, 1), new Date(2015, 0, 7)) // [2015-01-01T00:00, 2015-01-03T00:00, 2015-01-05T00:00]

As does this one:

d3.timeDay.every(2).range(new Date(2015, 0, 2), new Date(2015, 0, 8)) // [2015-01-03T00:00, 2015-01-05T00:00, 2015-01-07T00:00]

The returned filtered interval does not support interval.count. See also interval.filter.

# interval.count(start, end) · Source

Returns the number of interval boundaries after start (exclusive) and before or equal to end (inclusive). Note that this behavior is slightly different than interval.range because its purpose is to return the zero-based number of the specified end date relative to the specified start date. For example, to compute the current zero-based day-of-year number:

d3.timeDay.count(d3.timeYear(now), now) // 177

Likewise, to compute the current zero-based week-of-year number for weeks that start on Sunday:

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

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

Constructs a new custom interval given the specified floor and offset functions and an optional count function.

The floor function takes a single date as an argument and rounds it down to the nearest interval boundary.

The offset function takes a date and an integer step as arguments and advances the specified date by the specified number of boundaries; the step may be positive, negative or zero.

The optional count function takes a start date and an end date, already floored to the current interval, and returns the number of boundaries between the start (exclusive) and end (inclusive). If a count function is not specified, the returned interval does not expose interval.count or interval.every methods. Note: due to an internal optimization, the specified count function must not invoke interval.count on other time intervals.

The optional field function takes a date, already floored to the current interval, and returns the field value of the specified date, corresponding to the number of boundaries between this date (exclusive) and the latest previous parent boundary. For example, for the d3.timeDay interval, this returns the number of days since the start of the month. If a field function is not specified, it defaults to counting the number of interval boundaries since the UNIX epoch of January 1, 1970 UTC. The field function defines the behavior of interval.every.

Intervals

The following intervals are provided:

# d3.timeMillisecond · Source
# d3.utcMillisecond

Milliseconds; the shortest available time unit.

# d3.timeSecond · Source
# d3.utcSecond

Seconds (e.g., 01:23:45.0000 AM); 1,000 milliseconds.

# d3.timeMinute · Source
# d3.utcMinute · Source

Minutes (e.g., 01:02:00 AM); 60 seconds. Note that ECMAScript ignores leap seconds.

# d3.timeHour · Source
# d3.utcHour · Source

Hours (e.g., 01:00 AM); 60 minutes. Note that advancing time by one hour in local time can return the same hour or skip an hour due to daylight saving.

# d3.timeDay · Source
# d3.utcDay · Source
# d3.unixDay · Source

Days (e.g., February 7, 2012 at 12:00 AM); typically 24 hours. Days in local time may range from 23 to 25 hours due to daylight saving. d3.unixDay is like d3.utcDay, except it counts days since the UNIX epoch (January 1, 1970) such that interval.every returns uniformly-spaced dates rather than varying based on day-of-month.

# d3.timeWeek · Source
# d3.utcWeek · Source

Alias for d3.timeSunday; 7 days and typically 168 hours. Weeks in local time may range from 167 to 169 hours due to daylight saving.

# d3.timeSunday · Source
# d3.utcSunday · Source

Sunday-based weeks (e.g., February 5, 2012 at 12:00 AM).

# d3.timeMonday · Source
# d3.utcMonday · Source

Monday-based weeks (e.g., February 6, 2012 at 12:00 AM).

# d3.timeTuesday · Source
# d3.utcTuesday · Source

Tuesday-based weeks (e.g., February 7, 2012 at 12:00 AM).

# d3.timeWednesday · Source
# d3.utcWednesday · Source

Wednesday-based weeks (e.g., February 8, 2012 at 12:00 AM).

# d3.timeThursday · Source
# d3.utcThursday · Source

Thursday-based weeks (e.g., February 9, 2012 at 12:00 AM).

# d3.timeFriday · Source
# d3.utcFriday · Source

Friday-based weeks (e.g., February 10, 2012 at 12:00 AM).

# d3.timeSaturday · Source
# d3.utcSaturday · Source

Saturday-based weeks (e.g., February 11, 2012 at 12:00 AM).

# d3.timeMonth · Source
# d3.utcMonth · Source

Months (e.g., February 1, 2012 at 12:00 AM); ranges from 28 to 31 days.

# d3.timeYear · Source
# d3.utcYear · Source

Years (e.g., January 1, 2012 at 12:00 AM); ranges from 365 to 366 days.

Ranges

For convenience, aliases for interval.range are also provided as plural forms of the corresponding interval.

# d3.timeMilliseconds(start, stop[, step]) · Source
# d3.utcMilliseconds(start, stop[, step])

Aliases for d3.timeMillisecond.range and d3.utcMillisecond.range.

# d3.timeSeconds(start, stop[, step]) · Source
# d3.utcSeconds(start, stop[, step])

Aliases for d3.timeSecond.range and d3.utcSecond.range.

# d3.timeMinutes(start, stop[, step]) · Source
# d3.utcMinutes(start, stop[, step]) · Source

Aliases for d3.timeMinute.range and d3.utcMinute.range.

# d3.timeHours(start, stop[, step]) · Source
# d3.utcHours(start, stop[, step]) · Source

Aliases for d3.timeHour.range and d3.utcHour.range.

# d3.timeDays(start, stop[, step]) · Source
# d3.utcDays(start, stop[, step]) · Source
# d3.unixDays(start, stop[, step]) · Source

Aliases for d3.timeDay.range, d3.utcDay.range, and d3.unixDay.range.

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

Aliases for d3.timeWeek.range and d3.utcWeek.range.

# d3.timeSundays(start, stop[, step]) · Source
# d3.utcSundays(start, stop[, step]) · Source

Aliases for d3.timeSunday.range and d3.utcSunday.range.

# d3.timeMondays(start, stop[, step]) · Source
# d3.utcMondays(start, stop[, step]) · Source

Aliases for d3.timeMonday.range and d3.utcMonday.range.

# d3.timeTuesdays(start, stop[, step]) · Source
# d3.utcTuesdays(start, stop[, step]) · Source

Aliases for d3.timeTuesday.range and d3.utcTuesday.range.

# d3.timeWednesdays(start, stop[, step]) · Source
# d3.utcWednesdays(start, stop[, step]) · Source

Aliases for d3.timeWednesday.range and d3.utcWednesday.range.

# d3.timeThursdays(start, stop[, step]) · Source
# d3.utcThursdays(start, stop[, step]) · Source

Aliases for d3.timeThursday.range and d3.utcThursday.range.

# d3.timeFridays(start, stop[, step]) · Source
# d3.utcFridays(start, stop[, step]) · Source

Aliases for d3.timeFriday.range and d3.utcFriday.range.

# d3.timeSaturdays(start, stop[, step]) · Source
# d3.utcSaturdays(start, stop[, step]) · Source

Aliases for d3.timeSaturday.range and d3.utcSaturday.range.

# d3.timeMonths(start, stop[, step]) · Source
# d3.utcMonths(start, stop[, step]) · Source

Aliases for d3.timeMonth.range and d3.utcMonth.range.

# d3.timeYears(start, stop[, step]) · Source
# d3.utcYears(start, stop[, step]) · Source

Aliases for d3.timeYear.range and d3.utcYear.range.

Ticks

# d3.timeTicks(start, stop, count) · Source

Equivalent to d3.utcTicks, but in local time.

# d3.timeTickInterval(start, stop, count) · Source

Returns the time interval that would be used by d3.timeTicks given the same arguments.

# d3.utcTicks(start, stop, count) · Source

Returns an array of approximately count dates at regular intervals between start and stop (inclusive). If stop is before start, dates are returned in reverse chronological order; otherwise dates are returned in chronological order. The following UTC time intervals are considered:

  • 1 second
  • 5 seconds
  • 15 seconds
  • 30 seconds
  • 1 minute
  • 5 minutes
  • 15 minutes
  • 30 minutes
  • 1 hour
  • 3 hours
  • 6 hours
  • 12 hours
  • 1 day
  • 2 days
  • 1 week
  • 1 month
  • 3 months
  • 1 year

Multiples of milliseconds (for small ranges) and years (for large ranges) are also considered, following the rules of d3.ticks. The interval producing the number of dates that is closest to count is used. For example:

start = new Date(Date.UTC(1970, 2, 1))
stop = new Date(Date.UTC(1996, 2, 19))
count = 4
d3.utcTicks(start, stop, count) // [1975-01-01, 1980-01-01, 1985-01-01, 1990-01-01, 1995-01-01]

If count is a time interval, this function behaves similarly to interval.range except that both start and stop are inclusive and it may return dates in reverse chronological order if stop is before start.

# d3.utcTickInterval(start, stop, count) · Source

Returns the time interval that would be used by d3.utcTicks given the same arguments. If there is no associated interval, such as when start or stop is invalid, returns null.

More Repositories

1

d3

Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript
106,311
star
2

d3-shape

Graphical primitives for visualization, such as lines and areas.
JavaScript
2,458
star
3

d3-plugins

[DEPRECATED] A repository for sharing D3.js V3 plugins.
JavaScript
1,808
star
4

d3-force

Force-directed graph layout using velocity Verlet integration.
JavaScript
1,702
star
5

d3-scale

Encodings that map abstract data to visual representation.
JavaScript
1,567
star
6

d3-queue

Evaluate asynchronous tasks with configurable concurrency.
JavaScript
1,411
star
7

d3-hierarchy

2D layout algorithms for visualizing hierarchical data.
JavaScript
1,064
star
8

d3-geo-projection

Extended geographic projections for d3-geo.
JavaScript
1,058
star
9

d3-geo

Geographic projections, spherical shapes and spherical trigonometry.
JavaScript
988
star
10

d3-scale-chromatic

Sequential, diverging and categorical color scales.
JavaScript
787
star
11

d3-sankey

Visualize flow between nodes in a directed acyclic network.
JavaScript
763
star
12

d3-format

Format numbers for human consumption.
JavaScript
611
star
13

d3-ease

Easing functions for smooth animation.
JavaScript
604
star
14

d3-delaunay

Compute the Voronoi diagram of a set of two-dimensional points.
JavaScript
588
star
15

d3-selection

Transform the DOM by selecting elements and joining to data.
JavaScript
547
star
16

d3-zoom

Pan and zoom SVG, HTML or Canvas using mouse or touch input.
JavaScript
495
star
17

d3-contour

Compute contour polygons using marching squares.
JavaScript
487
star
18

d3-interpolate

Interpolate numbers, colors, strings, arrays, objects, whatever!
JavaScript
482
star
19

d3-array

Array manipulation, ordering, searching, summarizing, etc.
JavaScript
452
star
20

d3-dsv

A parser and formatter for delimiter-separated values, such as CSV and TSV.
JavaScript
416
star
21

d3-color

Color spaces! RGB, HSL, Cubehelix, CIELAB, and more.
JavaScript
389
star
22

d3-drag

Drag and drop SVG, HTML or Canvas using mouse or touch input.
JavaScript
328
star
23

d3-time-format

Parse and format times, inspired by strptime and strftime.
JavaScript
324
star
24

d3-voronoi

Compute the Voronoi diagram of a set of two-dimensional points.
JavaScript
250
star
25

d3-hexbin

Group two-dimensional points into hexagonal bins.
JavaScript
231
star
26

d3-quadtree

Two-dimensional recursive spatial subdivision.
JavaScript
225
star
27

d3-transition

Animated transitions for D3 selections.
JavaScript
219
star
28

d3-fetch

Convenient parsing for Fetch.
JavaScript
215
star
29

d3-axis

Human-readable reference marks for scales.
JavaScript
204
star
30

d3.github.com

The D3 website.
JavaScript
195
star
31

d3-path

Serialize Canvas path commands to SVG.
JavaScript
192
star
32

d3-timer

An efficient queue for managing thousands of concurrent animations.
JavaScript
159
star
33

d3-brush

Select a one- or two-dimensional region using the mouse or touch.
JavaScript
154
star
34

d3-3.x-api-reference

An archive of the D3 3.x API Reference.
153
star
35

d3-random

Generate random numbers from various distributions.
JavaScript
136
star
36

d3-chord

Visualizations relationships or network flow with a circular layout.
JavaScript
122
star
37

d3-tile

Compute the quadtree tiles to display in a rectangular viewport.
JavaScript
120
star
38

d3-collection

Handy data structures for elements keyed by string.
JavaScript
111
star
39

d3-request

A convenient alternative to XMLHttpRequest.
JavaScript
109
star
40

d3-geo-polygon

Clipping and geometric operations for spherical polygons.
JavaScript
102
star
41

d3-polygon

Geometric operations for two-dimensional polygons.
JavaScript
97
star
42

d3-require

A minimal, promise-based implementation to require asynchronous module definitions.
JavaScript
78
star
43

d3-selection-multi

Multi-value syntax for d3-selection and d3-transition.
JavaScript
75
star
44

d3-dispatch

Register named callbacks and call them with arguments.
JavaScript
75
star
45

versor

a home for Mike Bostock's versor.js
JavaScript
34
star
46

d3-bundler

DEPRECATED; use rollup/rollup.
JavaScript
34
star
47

d3-hsv

The HSV (Hue, Saturation, Value) color space.
JavaScript
26
star
48

d3-logo

D3 brand assets.
23
star
49

d3-cam16

A d3 implementation of the CIECAM16 color appearance model.
JavaScript
22
star
50

d3-hcg

The HCG (Hue, Chroma, Grayness) color space derived from the Munsell color system.
JavaScript
20
star
51

d3-scripts

Common scripts for D3 modules.
JavaScript
15
star
52

d3-hull

DEPRECATED; see d3-polygon’s hull function.
JavaScript
14
star
53

blur-benchmark

temporary benchmark for d3.blur implementations
JavaScript
2
star