Date: примеры (JAVASCRIPT)

Работа с датой и временем в JavaScript: объект Date
Раздел: Основные типы, Конструкторы
Date: Date

Конструктор Date в JavaScript

Функция Date() в JavaScript является конструктором для создания объектов, представляющих дату и время. Она используется для получения текущей временной метки, парсинга строк, арифметики с датами и форматирования. Объект Date основан на количестве миллисекунд, прошедших с 1 января 1970 года по UTC (Unix Epoch).

Конструктор может быть вызван несколькими способами:

  • Без аргументов: возвращает объект с текущей датой и временем.
  • С одним аргументом:
    • Строка: строка даты для парсинга (например, '2024-12-31').
    • Число: значение в миллисекундах с Unix Epoch.
  • С несколькими аргументами:
    • new Date(year, monthIndex, day, hours, minutes, seconds, milliseconds).
    • Только year и monthIndex обязательны.
    • Год задается полностью (2024). Месяц отсчитывается от 0 (январь) до 11 (декабрь).

Возвращаемое значение — объект Date. При вызове как обычной функции (без new) возвращает строку с текущей датой.

Основные примеры использования

Создание даты текущего момента

let now = new Date();
console.log(now);
// Вывод зависит от времени выполнения, например:
// Tue Oct 31 2023 14:48:00 GMT+0300 (Москва, стандартное время)

Создание из временной метки (timestamp)

let dateFromStamp = new Date(1698768000000);
console.log(dateFromStamp);
Mon Oct 31 2022 00:00:00 GMT+0300

Создание из строки

let dateFromString = new Date('2024-12-31T23:59:59');
console.log(dateFromString);
Tue Dec 31 2024 23:59:59 GMT+0300

Создание с использованием отдельных компонентов

let specificDate = new Date(2025, 0, 1, 12, 30, 0);
console.log(specificDate);
Wed Jan 01 2025 12:30:00 GMT+0300

Получение компонентов даты

let d = new Date('2023-12-25');
console.log(d.getFullYear(), d.getMonth(), d.getDate());
2023 11 25

Похожие возможности в JavaScript

Date.now(): возвращает количество миллисекунд с Unix Epoch для текущего момента. Используется для быстрого получения метки без создания объекта.

Date.parse(): парсит строку даты и возвращает временную метку (миллисекунды). Может быть менее надежным из-за различий в форматах.

Date.UTC(): принимает те же аргументы, что и конструктор Date, но возвращает временную метку по UTC, а не по локальному времени.

Intl.DateTimeFormat: объект для форматирования даты и времени с учетом локали. Предпочтителен для отображения дат пользователю.

Для сложных операций с датами часто используют библиотеки, например, Moment.js (устаревшая) или date-fns, которые предлагают более удобный API и поддержку часовых поясов.

Распространенные ошибки

Месяцы с нулевым индексом

// Ожидание января, но месяц 0 - это январь
let date = new Date(2024, 1, 1);
console.log(date.toDateString());
Thu Feb 01 2024 // Это 1 февраля, а не января

Проблемы с парсингом строк

// Формат может интерпретироваться по-разному в разных браузерах или локалях
let date = new Date('01/02/2023');
console.log(date); // MM/DD/YYYY или DD/MM/YYYY?
Mon Jan 02 2023 00:00:00 GMT+0300 // В РФ часто DD.MM.YYYY, но парсинг может дать MM/DD/YYYY

Игнорирование часовых поясов

let date = new Date('2024-01-01');
console.log(date.toString()); // Создается в UTC, а вывод в локальном времени
console.log(date.toISOString());
Mon Jan 01 2024 03:00:00 GMT+0300
2024-01-01T00:00:00.000Z // Разница в 3 часа для Москвы

Использование устаревших методов getYear()

let date = new Date(2024, 0, 1);
console.log(date.getYear()); // Вместо getFullYear()
console.log(date.getFullYear());
124 // Возвращает год минус 1900
2024

Изменения и новые возможности

Стандарт ECMAScript продолжает развиваться. В современных версиях JavaScript появилась поддержка временных зон IANA через параметр timeZone в Intl.DateTimeFormat и других методах.

Метод Date.prototype.toLocaleDateString() и подобные теперь имеют расширенные опции форматирования. Также добавлены методы Date.prototype.toTemporalInstant() для интеграции с предлагаемым Temporal API (на стадии предложения).

Temporal API — это новая, находящаяся в разработке, встроенная библиотека для работы с датами и временем, которая должна решить многие проблемы текущего объекта Date, такие как неизменяемость, поддержка часовых поясов и более понятный API.

Расширенные примеры

Вычисление разницы между двумя датами в днях

Пример javascript
let date1 = new Date('2024-01-01');
let date2 = new Date('2024-12-31');
let diffTime = Math.abs(date2 - date1);
let diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
console.log(diffDays);
365

Форматирование даты с использованием Intl.DateTimeFormat

Пример javascript
let date = new Date();
let formatter = new Intl.DateTimeFormat('ru-RU', {
  weekday: 'long',
  year: 'numeric',
  month: 'long',
  day: 'numeric'
});
console.log(formatter.format(date));
вторник, 31 октября 2023 г.

Добавление дней к дате

Пример javascript
function addDays(date, days) {
  let result = new Date(date);
  result.setDate(result.getDate() + days);
  return result;
}
let newDate = addDays(new Date('2024-01-01'), 10);
console.log(newDate.toDateString());
Thu Jan 11 2024

Получение последнего дня месяца

Пример javascript
function getLastDayOfMonth(year, month) {
  // Месяц от 0 до 11, создаем дату на 0-й день следующего месяца
  return new Date(year, month + 1, 0).getDate();
}
console.log(getLastDayOfMonth(2024, 1)); // Февраль 2024 (високосный)
29

Создание диапазона дат

Пример javascript
function getDateRange(start, end) {
  let range = [];
  let current = new Date(start);
  while (current <= end) {
    range.push(new Date(current));
    current.setDate(current.getDate() + 1);
  }
  return range;
}
let start = new Date('2024-01-01');
let end = new Date('2024-01-05');
console.log(getDateRange(start, end).map(d => d.toISOString().slice(0,10)));
['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04', '2024-01-05']

Аналоги в других языках программирования

PHP

// Функция date()
echo date('Y-m-d H:i:s');
// Класс DateTime
$date = new DateTime('now');
echo $date->format('Y-m-d');
2023-10-31 15:30:00
2023-10-31

Python

from datetime import datetime
# Текущая дата и время
now = datetime.now()
print(now.strftime('%Y-%m-%d'))
# Создание из строки
dt = datetime.strptime('2024-12-31', '%Y-%m-%d')
print(dt)
2023-10-31
2024-12-31 00:00:00

MySQL

SELECT NOW(), DATE('2024-12-31');
2023-10-31 15:30:00 | 2024-12-31

C (библиотека time.h)

#include 
time_t t = time(NULL);
struct tm *local = localtime(&t);
printf('%d-%02d-%02d', local->tm_year + 1900, local->tm_mon + 1, local->tm_mday);
2023-10-31

Основные отличия: в JavaScript месяцы начинаются с 0, в Python и PHP обычно с 1. Работа с часовыми поясами также различается.

JS Date function comments

En
Date Creates a new Date object representing the current date and time