Начало временного периода

В библиотеке Moment.js начало временного периода определяется приведением объекта даты-времени к началу выбранной единицы измерения. Такой подход используется для нормализации дат, группировки событий, построения интервалов и выполнения сравнений без учета «лишних» компонентов времени.

Нормализация даты к границе периода

Момент времени в JavaScript включает несколько уровней точности: год, месяц, день, час, минута, секунда и миллисекунда. При работе с интервалами часто требуется зафиксировать нижнюю границу выбранного периода, обнуляя все младшие компоненты.

В Moment.js для этого используется метод startOf().

Метод 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

Это значение используется для годовых отчётов и накопительных вычислений.

Мутация объекта Moment

Метод 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")

Результат будет основан на первом дне месяца с добавлением указанного смещения.

Взаимодействие с Unix-временем

После применения 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")

Во всех случаях сначала происходит парсинг, затем — обнуление младших единиц времени.

Сравнение с endOf()

startOf() всегда работает в паре с endOf(), формируя границы интервалов. Если startOf() фиксирует нижнюю границу, то endOf() устанавливает верхнюю, заполняя все младшие единицы максимальными значениями.

moment("2026-05-21").startOf("month")
moment("2026-05-21").endOf("month")

Разница между ними определяет полный диапазон выбранного периода.