В библиотеке Moment.js начало временного периода определяется приведением объекта даты-времени к началу выбранной единицы измерения. Такой подход используется для нормализации дат, группировки событий, построения интервалов и выполнения сравнений без учета «лишних» компонентов времени.
Момент времени в JavaScript включает несколько уровней точности: год, месяц, день, час, минута, секунда и миллисекунда. При работе с интервалами часто требуется зафиксировать нижнюю границу выбранного периода, обнуляя все младшие компоненты.
В Moment.js для этого используется метод startOf().
Метод startOf() изменяет исходный объект
moment, устанавливая его значение на начало указанной
единицы времени.
Общий синтаксис:
moment().startOf(unit)
где unit — строковое обозначение временной единицы.
Метод мутирует исходный объект, что важно учитывать при построении цепочек преобразований.
Пример базового использования:
const m = moment("2026-05-21 14:35:48");
const startOfDay = m.startOf("day");
// 2026-05-21 00:00:00.000
Метод startOf() поддерживает различные уровни временной
детализации.
При обнулении до уровня секунды, минуты или часа происходит последовательное обнуление младших единиц:
moment("2026-05-21 14:35:48.123").startOf("minute")
// 2026-05-21 14:35:00.000
moment("2026-05-21 14:35:48.123").startOf("hour")
// 2026-05-21 14:00:00.000
Логика обнуления всегда направлена вниз по иерархии времени.
Начало дня устанавливается на 00:00:00.000 текущей даты:
moment("2026-05-21 14:35:48").startOf("day")
// 2026-05-21 00:00:00.000
Это значение часто используется для фильтрации записей за текущий день.
Начало недели зависит от локали и конфигурации Moment.js. По умолчанию неделя может начинаться с воскресенья, однако в ряде локалей — с понедельника.
moment("2026-05-21").startOf("week")
Поведение определяется настройками локализации:
moment.locale('en') — неделя обычно начинается с
воскресеньяmoment.locale('ru') — неделя начинается с
понедельникаНачальная точка недели устанавливается на 00:00:00 первого дня недели.
При переходе к началу месяца устанавливается первый день месяца с нулевым временем:
moment("2026-05-21").startOf("month")
// 2026-05-01 00:00:00.000
Все последующие дни и время отбрасываются.
Квартал представляет собой группу из трёх месяцев. Начало квартала определяется первым месяцем соответствующего периода:
moment("2026-05-21").startOf("quarter")
// 2026-04-01 00:00:00.000
Границы кварталов:
Начало года фиксируется на 1 января:
moment("2026-05-21").startOf("year")
// 2026-01-01 00:00:00.000
Это значение используется для годовых отчётов и накопительных вычислений.
Метод startOf() изменяет исходный экземпляр, что влияет
на последующие операции:
const m = moment("2026-05-21 14:35:48");
m.startOf("day");
m.add(1, "hour");
// результат: 2026-05-21 01:00:00.000
Изменение состояния объекта делает важным создание копий при необходимости сохранения исходного значения:
const m = moment("2026-05-21 14:35:48");
const start = m.clone().startOf("day");
const original = m;
Локализация влияет прежде всего на недельные вычисления. Внутри
Moment.js используется настройка week и dow
(day of week), определяющая стартовый день.
Пример:
moment.locale('ru');
moment("2026-05-21").startOf("week")
// понедельник 00:00:00.000
При смене локали результат для одной и той же даты может отличаться, что критично для календарных интерфейсов и отчетных систем.
Начало периода часто применяется для формирования диапазонов дат:
const start = moment().startOf("day");
const end = moment().endOf("day");
Такая пара значений формирует полный диапазон суток, используемый в фильтрации данных.
При работе с базами данных это позволяет формировать запросы вида:
// псевдокод SQL
WHERE created_at >= start AND created_at <= end
Метод startOf() возвращает объект Moment, что позволяет
продолжать цепочки операций:
moment("2026-05-21 14:35:48")
.startOf("month")
.add(10, "days")
Результат будет основан на первом дне месяца с добавлением указанного смещения.
После применения startOf() можно получить числовое
представление времени:
moment("2026-05-21").startOf("day").valueOf()
Метод valueOf() возвращает количество миллисекунд с
начала Unix-эпохи, что используется при интеграции с низкоуровневыми
API.
При использовании Moment.js с поддержкой временных зон
(moment-timezone), startOf() применяется после
интерпретации даты в рамках текущей зоны:
moment.tz("2026-05-21 14:35", "Asia/Almaty").startOf("day")
Начало дня будет вычислено относительно локального времени указанной зоны, а не UTC.
При создании Moment-объекта из строки или объекта Date результат
нормализуется перед применением startOf():
moment(new Date()).startOf("hour")
moment("2026-05-21T14:35:48Z").startOf("day")
Во всех случаях сначала происходит парсинг, затем — обнуление младших единиц времени.
startOf() всегда работает в паре с endOf(),
формируя границы интервалов. Если startOf() фиксирует
нижнюю границу, то endOf() устанавливает верхнюю, заполняя
все младшие единицы максимальными значениями.
moment("2026-05-21").startOf("month")
moment("2026-05-21").endOf("month")
Разница между ними определяет полный диапазон выбранного периода.