d3-time
При визуализации временных рядов, анализе временных закономерностей или работе со временем в целом неравномерность обычных временных единиц быстро становится очевидной. Например, в григорианском календаре большинство месяцев имеют 31 день, но некоторые имеют 28, 29 или 30; большинство лет имеют 365 дней, но високосные годы имеют 366; а с переходом на летнее время большинство дней имеют 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
Интервал дней интервала — один из нескольких, предоставляемых модулем d3-time. Каждый интервал представляет собой обычную временную единицу — часов, недель, месяцев, и т. д. — и имеет методы для вычисления граничных дат. Например, d3.timeDay вычисляет полночь (обычно 00:00 по местному времени) соответствующего дня. Помимо округления и подсчета, интервалы также могут использоваться для генерации массивов граничных дат. Например, чтобы вычислить каждое воскресенье текущего месяца:
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 не реализует собственную систему календаря; он просто реализует удобный API для календарных вычислений на основе ECMAScript Date. Таким образом, он игнорирует високосные секунды и может работать только с местным часовым поясом и координированным универсальным временем (UTC).
Этот модуль используется в шкалах времени D3 для генерации осмысленных делений, в формате времени D3, а также может использоваться напрямую для выполнения задач, таких как макеты календаря.
Установка
Если вы используете NPM, npm install d3-time. В противном случае загрузите последнюю версию. Вы также можете загрузить его напрямую с d3js.org, как самостоятельную библиотеку, так и как часть 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>
Попробуйте d3-time в вашем браузере.
Справочник по API
interval(date) Источник
Псевдоним для interval.floor. Например, d3.timeYear(date) и d3.timeYear.floor(date) эквивалентны.
interval.floor(date) Источник
Возвращает новую дату, представляющую последнюю граничную дату интервала до или равную date. Например, d3.timeDay.floor(date) обычно возвращает 00:00 по местному времени на заданную date.
Этот метод идемпотентен: если указанная 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;
} Это более надёжно, чем проверка того, что время — 00:00, так как в некоторых часовых поясах полночь может не существовать из-за перехода на летнее время.
interval.round(date) Источник
Возвращает новую дату, представляющую граничную дату интервала, наиболее близкую к date. Например, d3.timeDay.round(date) обычно возвращает 00:00 по местному времени на заданную date, если она находится до или на уровне полудня, и 00:00 следующего дня, если она после полудня.
Этот метод идемпотентен: если указанная date уже округлена до текущего интервала, возвращается новая дата с идентичным временем.
interval.ceil(date) Источник
Возвращает новую дату, представляющую самую раннюю граничную дату интервала после или равную date. Например, d3.timeDay.ceil(date) обычно возвращает 00:00 по местному времени на дату, следующую за заданной date.
Этот метод идемпотентен: если указанная date уже округляется до потолка текущего интервала, возвращается новая дата с идентичным временем. Кроме того, возвращаемая дата — это максимальное выразимое значение ассоциированного интервала, такое что interval.ceil(interval.ceil(date) + 1) возвращает следующую граничную дату интервала.
interval.offset(date[, step]) Источник
Возвращает новую дату, равную date плюс step интервалов. Если step не указан, он по умолчанию равен 1. Если step отрицательный, возвращаемая дата будет до указанной date; если step равен нулю, возвращается копия указанной date; если step не целое число, он округляется до ближайшего целого. Этот метод не округляет указанную date до интервала. Например, если date — сегодня в 17:34, то d3.timeDay.offset(date, 1) возвращает 17:34 завтра (даже если переход на летнее время изменится!).
interval.range(start, stop[, step]) Источник
Возвращает массив дат, представляющий каждую граничную дату интервала после или равную start (включительно) и до stop (исключая). Если указан step, то будет возвращаться каждая step-я граничная дата; например, для интервала d3.timeDay значение step, равное 2, вернёт каждый второй день. Если step не целое число, оно округляется до ближайшего целого.
Первая дата в возвращаемом массиве — это самая ранняя граница после или равная start; последующие даты смещаются на step интервалов и округляются до interval.floor. Таким образом, два перекрывающихся диапазона могут быть согласованы. Например, этот диапазон содержит нечётные дни:
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. Функция test получает дату и должна возвращать true только в том случае, если указанная дата должна считаться частью интервала. Например, чтобы создать интервал, возвращающий 1-е, 11-е, 21-е и 31-е (если оно существует) каждого месяца:
var i = d3.timeDay.filter(function(d) { return (d.getDate() - 1) % 10 === 0; }); Возвращаемый отфильтрованный интервал не поддерживает interval.count. Смотрите также interval.every.
interval.every(step) Источник
Возвращает отфильтрованный вид этого интервала, представляющий каждую step-ю дату. Значение step зависит от родительского интервала этого интервала, определённого функцией поля. Например, d3.timeMinute.every(15) возвращает интервал, представляющий каждые пятнадцать минут, начиная с часа: :00, :15, :30, :45 и т. д. Обратите внимание, что для некоторых интервалов результирующие даты могут не быть равномерно распределены; родительским интервалом для d3.timeDay является d3.timeMonth, и поэтому номер интервала сбрасывается в начале каждого месяца. Если step недействителен, возвращает null. Если step равен единице, возвращает этот интервал.
Этот метод можно использовать совместно с 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. Например, чтобы вычислить текущий номер дня года, начиная с нуля:
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 принимает в качестве аргументов дату и целое число шага и сдвигает указанную дату на указанное количество границ; шаг может быть положительным, отрицательным или нулевым.
Необязательная функция count принимает начальную и конечную даты, уже округлённые до текущего интервала, и возвращает количество границ между началом (исключительно) и концом (включительно). Если функция count не указана, возвращаемый интервал не предоставляет методы interval.count и interval.every. Примечание: из-за внутренней оптимизации указанная функция count не должна вызывать interval.count для других временных интервалов.
Необязательная функция field принимает дату, уже округлённую до текущего интервала, и возвращает значение поля указанной даты, соответствующее количеству границ между этой датой (исключительно) и последней предыдущей родительской границей. Например, для интервала d3.timeDay она возвращает количество дней с начала месяца. Если функция field не указана, она по умолчанию считает количество границ интервала с эпохи Unix 1 января 1970 года по UTC. Функция field определяет поведение метода interval.every.
Интервалы
Предоставлены следующие интервалы:
d3.timeMillisecond Source
d3.utcMillisecond
Миллисекунды; наименьший доступный временной интервал.
d3.timeSecond Source
d3.utcSecond
Секунды (например, 01:23:45.0000 AM); 1000 миллисекунд.
d3.timeMinute Source
d3.utcMinute Source
Минуты (например, 01:02:00 AM); 60 секунд. Обратите внимание, что ECMAScript игнорирует високосные секунды.
d3.timeHour Source
d3.utcHour Source
Часы (например, 01:00 AM); 60 минут. Обратите внимание, что сдвиг времени на один час по местному времени может вернуть тот же час или пропустить час из-за перехода на летнее время.
d3.timeDay Source
d3.utcDay Source
Дни (например, 7 февраля 2012 года в 12:00 AM); обычно 24 часа. Дни по местному времени могут составлять от 23 до 25 часов из-за перехода на летнее время.
d3.timeWeek Source
d3.utcWeek Source
Псевдоним для d3.timeSunday; 7 дней и обычно 168 часов. Недели по местному времени могут варьироваться от 167 до 169 часов из-за перехода на летнее время.
d3.timeSunday Source
d3.utcSunday Source
Недели, начинающиеся с воскресенья (например, 5 февраля 2012 года в 12:00 AM).
d3.timeMonday Source
d3.utcMonday Source
Недели, начинающиеся с понедельника (например, 6 февраля 2012 года в 12:00 AM).
d3.timeTuesday Source
d3.utcTuesday Source
Недели, начинающиеся со вторника (например, 7 февраля 2012 года в 12:00 AM).
d3.timeWednesday Source
d3.utcWednesday Source
Недели, начинающиеся со среды (например, 8 февраля 2012 года в 12:00 AM).
d3.timeThursday Source
d3.utcThursday Source
Недели, начинающиеся с четверга (например, 9 февраля 2012 года в 12:00 AM).
d3.timeFriday Source
d3.utcFriday Source
Недели, начинающиеся с пятницы (например, 10 февраля 2012 года в 12:00 AM).
d3.timeSaturday Source
d3.utcSaturday Source
Недели, начинающиеся с субботы (например, 11 февраля 2012 года в 12:00 AM).
d3.timeMonth Source
d3.utcMonth Source
Месяцы (например, 1 февраля 2012 года в 12:00 AM); диапазон от 28 до 31 дня.
d3.timeYear Source
d3.utcYear Source
Годы (например, 1 января 2012 года в 12:00 AM); диапазон от 365 до 366 дней.
Диапазоны
Для удобства также предоставлены псевдонимы для interval.range в виде множественного числа соответствующего интервала.
d3.timeMilliseconds(start, stop[, step]) Source
d3.utcMilliseconds(start, stop[, step])
Псевдонимы для d3.timeMillisecond.range и d3.utcMillisecond.range.
d3.timeSeconds(start, stop[, step]) Source
d3.utcSeconds(start, stop[, step])
Псевдонимы для d3.timeSecond.range и d3.utcSecond.range.
d3.timeMinutes(start, stop[, step]) Source
d3.utcMinutes(start, stop[, step]) Source
Псевдонимы для d3.timeMinute.range и d3.utcMinute.range.
d3.timeHours(start, stop[, step]) Source
d3.utcHours(start, stop[, step]) Source
Псевдонимы для d3.timeHour.range и d3.utcHour.range.
d3.timeDays(start, stop[, step]) Source
d3.utcDays(start, stop[, step]) Source
Псевдонимы для d3.timeDay.range и d3.utcDay.range.
d3.timeWeeks(start, stop[, step])
d3.utcWeeks(start, stop[, step])
Псевдонимы для d3.timeWeek.range и d3.utcWeek.range.
d3.timeSundays(start, stop[, step]) Source
d3.utcSundays(start, stop[, step]) Source
Псевдонимы для d3.timeSunday.range и d3.utcSunday.range.
d3.timeMondays(start, stop[, step]) Source
d3.utcMondays(start, stop[, step]) Source
Псевдонимы для d3.timeMonday.range и d3.utcMonday.range.
d3.timeTuesdays(start, stop[, step]) Source
d3.utcTuesdays(start, stop[, step]) Source
Псевдонимы для d3.timeTuesday.range и d3.utcTuesday.range.
d3.timeWednesdays(start, stop[, step]) Source
d3.utcWednesdays(start, stop[, step]) Source
Псевдонимы для d3.timeWednesday.range и d3.utcWednesday.range.
d3.timeThursdays(start, stop[, step]) Source
d3.utcThursdays(start, stop[, step]) Source
Псевдонимы для d3.timeThursday.range и d3.utcThursday.range.
d3.timeFridays(start, stop[, step]) Source
d3.utcFridays(start, stop[, step]) Source
Псевдонимы для d3.timeFriday.range и d3.utcFriday.range.
d3.timeSaturdays(start, stop[, step]) Source
d3.utcSaturdays(start, stop[, step]) Source
Псевдонимы для d3.timeSaturday.range и d3.utcSaturday.range.
d3.timeMonths(start, stop[, step]) Source
d3.utcMonths(start, stop[, step]) Source
Псевдонимы для d3.timeMonth.range и d3.utcMonth.range.
d3.timeYears(start, stop[, step]) Source
d3.utcYears(start, stop[, step]) Source
Псевдонимы для d3.timeYear.range и d3.utcYear.range.
© 2010–2018 Michael Bostock
Licensed under the BSD License.
https://github.com/d3/d3-time