В PHP работа с датами обычно идёт через DateTime или Carbon. В JavaScript всё иначе. Тут миллисекунды, UTC и местное время. Если ты привык к PHP, поначалу будет странно. Но ничего сложного. В этой статье разложу по полочкам: как создавать, менять и выводить даты. И главное — как не сойти с ума.
Зачем вообще JavaScript умеет работать с датами
Любой сайт или приложение рано или поздно сталкивается с временем. Таймеры, календари, логи, дедлайны. Без дат никуда. В JavaScript за это отвечает встроенный объект Date. Он хранит время в миллисекундах, прошедших с 1 января 1970 года. Это называется Unix-время, только в миллисекундах, а не секундах, как в PHP.
Сразу запомни: в JS время считается от 1970 года в UTC. Местные часовые пояса добавляются уже при выводе. Если ты работаешь с сервером на PHP, всегда передавай время в 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() и т.д. Это важно, если ты получаешь время с сервера и хочешь избежать сдвигов.
Как форматировать дату в строку
Встроенные методы форматирования есть, но они не всегда удобны. Например, 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. Тогда работа с датами на клиенте перестанет быть проблемой.



