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

В основе работы с датами в JavaScript лежит встроенный объект Date, предоставляющий доступ к времени на уровне миллисекунд. Библиотека date-fns не заменяет этот объект, а расширяет и стандартизирует операции создания, парсинга и преобразования дат, устраняя неоднозначности и поведенческие различия между форматами входных данных.


Базовое создание даты через конструктор Date

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

const now = new Date();

Создание текущего момента времени основано на системных часах окружения выполнения.

Передача числового значения интерпретируется как количество миллисекунд с начала эпохи Unix:

const dateFromTimestamp = new Date(1700000000000);

Передача отдельных компонентов даты:

const specificDate = new Date(2026, 0, 15, 10, 30, 0);

Особенность конструкции заключается в том, что месяц задаётся с нуля, где 0 соответствует январю, а 11 — декабрю.


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

Конструктор Date поддерживает парсинг строк, однако поведение зависит от реализации движка JavaScript и формата строки.

const parsedDate = new Date("2026-01-15T10:30:00Z");

ISO 8601 считается наиболее стабильным форматом, однако любые отклонения от стандарта могут приводить к неоднозначному результату:

const ambiguousDate = new Date("01/15/2026");

Такие случаи создают зависимость от локали и окружения выполнения, что делает прямой парсинг строк ненадёжным.


ISO-формат и его особенности

ISO 8601 используется как универсальный стандарт представления даты и времени:

const isoDate = new Date("2026-01-15T10:30:00.000Z");

Суффикс Z фиксирует временную зону как UTC. При отсутствии указания зоны происходит интерпретация в локальном часовом поясе среды выполнения.


Unix timestamp и преобразование времени

Unix timestamp представляет собой количество секунд или миллисекунд с 1 января 1970 года UTC.

const dateFromMs = new Date(1700000000000);

При работе с секундными значениями требуется преобразование:

const seconds = 1700000000;
const dateFromSeconds = new Date(seconds * 1000);

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


Создание даты через date-fns: parseISO

Библиотека date-fns предоставляет функцию parseISO, обеспечивающую строгий и предсказуемый парсинг ISO-строк без зависимости от реализации Date.parse.

import { parseISO } from "date-fns";

const date = parseISO("2026-01-15T10:30:00Z");

parseISO поддерживает только корректные ISO-форматы, что исключает неоднозначные интерпретации и ошибки локали.


Универсальный парсинг строк: parse

Функция parse используется для преобразования строки в объект Date по заданному шаблону.

import { parse } from "date-fns";

const date = parse(
  "15-01-2026 10:30",
  "dd-MM-yyyy HH:mm",
  new Date()
);

Третий аргумент задаёт опорную дату, используемую для заполнения отсутствующих компонентов.

Механизм основан на строгом сопоставлении токенов формата, что позволяет контролировать интерпретацию входных данных независимо от локали среды.


Создание даты из Unix timestamp в date-fns: fromUnixTime

Функция fromUnixTime предназначена для преобразования секундного Unix timestamp в объект Date.

import { fromUnixTime } from "date-fns";

const date = fromUnixTime(1700000000);

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


Нормализация входных данных при создании даты

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

Типовые формы входных значений:

  • ISO-строки
  • Unix timestamps (секунды и миллисекунды)
  • пользовательские форматы строк

Использование date-fns позволяет разделить эти случаи на специализированные функции:

import { parseISO, parse, fromUnixTime } from "date-fns";

const a = parseISO("2026-01-15T10:30:00Z");
const b = fromUnixTime(1700000000);
const c = parse("15.01.2026", "dd.MM.yyyy", new Date());

Такое разделение уменьшает неопределённость интерпретации и повышает предсказуемость результата.


Особенности работы с локальным временем и UTC

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

ISO-строки с Z фиксируют UTC:

new Date("2026-01-15T10:30:00Z");

Строки без указания зоны интерпретируются как локальное время:

new Date("2026-01-15T10:30:00");

Функции date-fns при создании даты не изменяют базовую модель Date, но обеспечивают более строгий контроль входных данных, снижая риск неоднозначного парсинга и скрытых смещений времени.