В PHP работа с датами обычно идёт через DateTime или Carbon. В JavaScript всё иначе. Тут миллисекунды, UTC и местное время. Если ты привык к PHP, поначалу будет странно. Но ничего сложного. В этой статье разложу по полочкам: как создавать, менять и выводить даты. И главное — как не сойти с ума.

Зачем вообще JavaScript умеет работать с датами

Любой сайт или приложение рано или поздно сталкивается с временем. Таймеры, календари, логи, дедлайны. Без дат никуда. В JavaScript за это отвечает встроенный объект Date. Он хранит время в миллисекундах, прошедших с 1 января 1970 года. Это называется Unix-время, только в миллисекундах, а не секундах, как в PHP.

Сразу запомни: в JS время считается от 1970 года в UTC. Местные часовые пояса добавляются уже при выводе. Если ты работаешь с сервером на PHP, всегда передавай время в UTC. Иначе начнутся глюки.

Правило: Всегда храни даты в UTC. На клиенте преобразуй в локальное время только для показа. Это спасёт от головной боли с часовыми поясами.

Как создать дату в JavaScript

Самый простой способ — вызвать new Date() без аргументов. Получишь текущий момент. Но это редко нужно. Обычно мы передаём конкретное время.

Вот основные варианты создания даты:

  • new Date() — текущее время
  • new Date(milliseconds) — из миллисекунд (Unix-время)
  • new Date(dateString) — из строки, например '2025-03-20T10:00:00Z'
  • new Date(year, month, day, hours, minutes, seconds, ms) — из компонентов

Важно: месяц в JS считается с нуля. Январь — это 0, февраль — 1, и так далее. Если передать 12, это уже январь следующего года. Типичная ошибка новичков.

Пример:

// Создаём 20 марта 2025 года, 10:00:00
const date = new Date(2025, 2, 20, 10, 0, 0);
console.log(date);

Обрати внимание: месяц 2 — это март. Если передать 3, будет апрель. Запомни это как таблицу умножения.

Как получить компоненты даты

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

Таблица основных методов:

Метод Описание Пример значения
getFullYear() Год (4 цифры) 2025
getMonth() Месяц (0-11) 2 (март)
getDate() День месяца (1-31) 20
getDay() День недели (0-6, воскресенье=0) 4 (четверг)
getHours() Часы (0-23) 10
getMinutes() Минуты (0-59) 0
getSeconds() Секунды (0-59) 0
getMilliseconds() Миллисекунды (0-999) 0
getTime() Миллисекунды с 1970 года 1742460000000

Для UTC просто добавь UTC в название: getUTCFullYear(), getUTCMonth() и т.д. Это важно, если ты получаешь время с сервера и хочешь избежать сдвигов.

Лайфхак: Если нужно получить количество миллисекунд для передачи в PHP, используй Math.floor(date.getTime() / 1000). PHP ожидает секунды, а JS даёт миллисекунды.

Как форматировать дату в строку

Встроенные методы форматирования есть, но они не всегда удобны. Например, toLocaleDateString() возвращает дату в локальном формате. Можно указать язык и опции.

Пример:

const date = new Date(2025, 2, 20, 10, 0, 0);
// Русская локаль
console.log(date.toLocaleDateString('ru-RU')); // 20.03.2025
console.log(date.toLocaleTimeString('ru-RU')); // 10:00:00

Если нужно больше контроля, используй Intl.DateTimeFormat. Он гибче.

const formatter = new Intl.DateTimeFormat('ru-RU', {
  year: 'numeric',
  month: 'long',
  day: 'numeric',
  hour: '2-digit',
  minute: '2-digit'
});
console.log(formatter.format(date)); // 20 марта 2025 г. в 10:00

Но для кастомных форматов (например, '2025-03-20 10:00:00') проще написать свою функцию. Или использовать библиотеку, если проект большой.

Как менять дату и считать разницу

Методы set позволяют менять компоненты. Например, setFullYear(), setMonth() и т.д. Они изменяют исходный объект. Если нужно получить новую дату, клонируй.

Пример:

const date = new Date(2025, 2, 20);
date.setDate(date.getDate() + 10); // +10 дней
console.log(date); // 30 марта 2025

Вычитание дат даёт разницу в миллисекундах. Дели на 1000, 60, 60, 24, чтобы получить дни.

const start = new Date(2025, 2, 20);
const end = new Date(2025, 2, 25);
const diffMs = end - start;
const diffDays = diffMs / (1000 * 60 * 60 * 24);
console.log(diffDays); // 5

Учти: при переводе на летнее время дни могут быть не 24 часа. Для точных расчётов лучше использовать библиотеки.

Типичные ошибки и как их избежать

Первая ошибка — путаница с месяцами. Помни: 0 — январь, 11 — декабрь. Вторая — передача строки в нестандартном формате. Парсер может интерпретировать её по-своему. Лучше используй ISO 8601: '2025-03-20T10:00:00Z'. Третья — забыть про часовые пояса. Если сервер в UTC, а клиент в +3, будет сдвиг.

Вот таблица безопасных форматов для new Date(dateString):

Формат Пример Комментарий
ISO 8601 2025-03-20T10:00:00Z Стандарт, работает везде
YYYY-MM-DD 2025-03-20 Без времени, интерпретируется как UTC
Unix в миллисекундах 1742460000000 Число, без неоднозначностей

Если работаешь с PHP, лучше всего передавать время в формате ISO 8601 или числом (миллисекунды). Избегай форматов вроде '03/20/2025' — они зависят от локали.

Что в итоге

JavaScript Date — мощный, но коварный инструмент. Главное: помни про месяцы с нуля, используй UTC для хранения и не парси строки вручную. Для простых задач хватит встроенных методов. Для сложных — бери библиотеку вроде day.js или date-fns. Они легче и понятнее.

Если ты PHP-разработчик, привыкай к миллисекундам и методам getUTC. Тогда работа с датами на клиенте перестанет быть проблемой.

Студия WNDER