Объект `Date`

В этой статье объясняется объект Date.

Мы поэтапно объясним объект Date — от базовых механизмов до часто используемых операций на практике, с конкретными примерами.

YouTube Video

Объект Date

Что такое объект Date?

Объект Date в JavaScript — это стандартный объект для работы с датой и временем. Внутри он управляет датой и временем на основе количества миллисекунд, прошедших с 1 января 1970 года, 00:00:00 UTC.

Сначала давайте создадим объект Date, представляющий текущую дату и время, и проверим его содержимое.

1const now = new Date();
2console.log(now);
  • Этот код создает объект Date, который представляет текущую дату и время на момент выполнения. Формат отображения зависит от среды выполнения, например, браузера или операционной системы.

Как создать объект Date

Объекты Date можно создавать различными способами в зависимости от ваших потребностей. Особо важный момент, в котором легко ошибиться — аргумент конструктора для месяца отсчитывается с нуля, то есть месяцы начинаются с 0.

1const d1 = new Date();                     // Current date and time
2const d2 = new Date("2025-01-01");         // Create from an ISO date string
3const d3 = new Date(2025, 0, 1);           // January 1, 2025 (month is zero-based)
4const d4 = new Date(2025, 0, 1, 10, 30);   // January 1, 2025, 10:30
5
6console.log(d1, d2, d3, d4);
  • В new Date(year, month, day) аргумент month означает, что 0 — это январь, а 11 — декабрь. Если не понимать этой особенности, можно случайно создать дату, отличающуюся на один месяц, поэтому всегда будьте внимательны.

Получение отдельных элементов даты и времени

Из объекта Date можно отдельно получить год, месяц, день, время и день недели. Все методы получения возвращают значения в виде чисел.

1const date = new Date();
2
3console.log(date.getFullYear()); // Year
4console.log(date.getMonth());    // Month (0-based: 0 = January)
5console.log(date.getDate());     // Day of the month
6console.log(date.getHours());    // Hours
7console.log(date.getMinutes());  // Minutes
8console.log(date.getSeconds());  // Seconds
9console.log(date.getDay());      // Day of the week (0 = Sunday, 6 = Saturday)
  • Как и при создании, имейте в виду, что getMonth() также отсчитывается с нуля. При выводе обычно добавляют 1 к значению для корректного отображения месяца.
  • getDay() возвращает день недели в виде числа. 0 означает воскресенье, а 6 — субботу.

Изменение даты и времени

Объект Date является изменяемым, то есть его значения можно изменить позднее. Это свойство удобно, но нужно быть осторожным с нежелательными побочными эффектами.

Вы можете использовать методы set для изменения значений существующего объекта Date.

1const date = new Date("2025-01-01");
2
3date.setFullYear(2026);
4date.setMonth(5);   // June
5date.setDate(15);
6
7console.log(date);
  • setMonth() также воспринимает месяцы с нуля. Исходный объект изменяется напрямую.

Сложение и вычитание дат

Вычисления с датами обычно выполняются с помощью миллисекунд или метода setDate(). Для вычислений по дням использование setDate() особенно интуитивно и безопасно.

1const date = new Date("2025-01-01");
2
3date.setDate(date.getDate() + 7);
4console.log(date);
  • В этом примере мы вычисляем дату, которая наступит через 7 дней после указанной. Даже если прибавление пересекает границу месяца, дата автоматически корректируется.

Сравнение объектов Date

Объекты Date можно сравнивать как числа. Это связано с тем, что сравниваются внутренние значения в миллисекундах.

1const a = new Date("2025-01-01");
2const b = new Date("2025-01-10");
3
4console.log(a < b);   // true
5console.log(a > b);   // false
  • Если нужно определить порядок дат, никакое дополнительное преобразование не требуется. Можно напрямую использовать операторы сравнения.

Работа с метками времени (миллисекунды)

Date можно конвертировать в числа, представляющие миллисекунды (метки времени), и обратно. Этот формат часто используется в API и интеграциях с базами данных.

1const now = Date.now();
2console.log(now);
3
4const date = new Date(now);
5console.log(date);
  • Date.now() возвращает текущее время в миллисекундах. Это очень удобно, когда нужно сохранить или сравнить значение как число.

Форматирование дат в строки

Отображение объекта Date как есть часто приводит к формату, который может не соответствовать вашим нуждам. Поэтому следует явно форматировать дату в соответствии с вашими требованиями.

1const date = new Date("2025-01-01");
2
3const formatted = `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`;
4console.log(formatted);
  • При ручном форматировании вы получаете полный контроль над форматом отображения. На практике для этого часто используются библиотеки.

Разница между UTC и локальным временем

Объект Date предоставляет методы для работы как с локальным временем, так и с UTC. Очень важно правильно понимать эту разницу для интеграции с сервером и обеспечения международной совместимости.

1const date = new Date();
2
3console.log(date.getHours());    // Local time (hours)
4console.log(date.getUTCHours()); // UTC time (hours)
  • Методы getUTC* всегда возвращают значения по UTC. Будьте особо внимательны при работе с данными в разных временных зонах.

Меры предосторожности при использовании объектов Date

Date — удобный объект, но у него есть свои подводные камни. В частности, отсчет месяцев с нуля и изменяемость объекта являются частыми причинами ошибок.

Давайте рассмотрим конкретные примеры ниже, чтобы увидеть, как изменяемость объекта Date влияет на его поведение.

1const original = new Date("2025-01-01");
2const copy = new Date(original);
3
4copy.setDate(10);
5
6console.log(original);
7console.log(copy);
  • Если хотите сохранить исходную дату и время, всегда создавайте копию. Просто осознание этого момента поможет избежать неожиданных ошибок.

Причины, по которым с объектом Date сложно работать, и критерии выбора сторонних библиотек.

Объект Date предоставляет достаточно функций как стандартное средство, но на практике бывают ситуации, когда его использование оказывается затруднительным. К типичным проблемам относятся: отсчет месяцев и дней недели с нуля, частое путаница между местным временем и UTC, а также изменяемость объекта. Эти проблемы могут привести к увеличению количества ошибок при усложнении обработки дат.

Date достаточно для простого получения и сравнения дат, но при усложнении вычислений или форматировании отображения читаемость и сопровождаемость кода ухудшаются.

Если у вас есть следующие требования, рекомендуется рассмотреть использование легковесных библиотек для работы с датами, таких как dayjs или date-fns.

  • Вам необходимо явно работать с часовыми поясами.
  • Вам часто требуется выполнять вычисления с датами или интервалами.
  • Вам требуется гибко изменять формат отображения.
  • Вам нужно работать с датами и временем неизменяемо.

Резюме

Объекты Date — это основной инструмент для работы с датой и временем в JavaScript. Понимая его особенности и правильно создавая, извлекая, вычисляя и форматируя даты, вы сможете безопасно использовать Date на практике.

Освоив основы, целесообразно использовать сторонние библиотеки для работы с датами в случае необходимости.

Вы можете следовать этой статье, используя Visual Studio Code на нашем YouTube-канале. Пожалуйста, также посмотрите наш YouTube-канал.

YouTube Video