Функция toDate в Date-fns выполняет одну из базовых и
критически важных задач — приводит различные типы временных значений к
полноценному объекту Date. Это слой нормализации, который
устраняет неоднородность входных данных и обеспечивает единый формат для
дальнейших операций с датами.
Внутри Date-fns множество функций работают только с экземплярами
Date. Однако на практике входные данные могут приходить в
разных формах:
DatetoDate выступает как универсальный адаптер, приводящий
всё к единому типу. Это снижает необходимость ручных проверок и повышает
предсказуемость поведения функций библиотеки.
Ключевая идея: любое допустимое представление времени →
строгий Date
Сигнатура:
toDate(argument)
Функция возвращает новый объект Date, основанный на
переданном значении.
Если передан корректный объект Date, происходит его
клонирование:
import { toDate } from 'date-fns';
const original = new Date(2024, 0, 1);
const result = toDate(original);
console.log(result); // 2024-01-01T00:00:00.000Z (локально зависит от таймзоны)
console.log(result === original); // false
Важно: возвращается новый экземпляр, а не ссылка на исходный объект. Это предотвращает побочные эффекты при мутациях.
Числовое значение интерпретируется как миллисекунды с Unix-эпохи:
toDate(0); // 1970-01-01T00:00:00.000Z
toDate(1700000000000); // соответствующая дата
Такой вариант часто встречается в API, базах данных и событиях.
Строка передаётся в стандартный конструктор Date:
toDate('2024-01-01');
toDate('2024-01-01T10:00:00Z');
Поведение зависит от реализации движка JavaScript и формата строки.
Некорректные строки приводят к Invalid Date.
Если объект не является Date, но может быть преобразован
через Date(), он будет интерпретирован стандартным
механизмом:
toDate({ toString: () => '2024-01-01' });
Результат зависит от того, как JavaScript интерпретирует значение.
Логика функции по сути сводится к нескольким шагам:
DateDate(value)Упрощённая модель:
function toDate(value) {
if (value instanceof Date) {
return new Date(value.getTime());
}
return new Date(value);
}
Объекты Date в JavaScript являются
изменяемыми:
const a = new Date();
const b = a;
b.setFullYear(2000);
console.log(a.getFullYear()); // 2000
Без клонирования функции Date-fns могли бы случайно изменять исходные
значения. toDate устраняет этот риск.
toDate часто применяется как внутренний слой в других
функциях библиотеки:
Пример логики:
function someInternalFn(input) {
const date = toDate(input);
// дальнейшая работа только с Date
}
Это гарантирует, что все операции работают с единым типом данных.
toDate не выполняет нормализацию временных зон. Он лишь
создаёт объект Date, а интерпретация:
определяется самим JavaScript.
Пример:
toDate('2024-01-01T00:00:00Z'); // UTC время
toDate('2024-01-01'); // локальная интерпретация
Если входное значение невозможно интерпретировать как дату:
toDate('invalid');
toDate(undefined);
toDate(null);
результатом будет:
Invalid Date
Проверка валидности осуществляется отдельно через
isValid в Date-fns.
const apiValue = '2024-03-10T12:00:00Z';
const date = toDate(apiValue);
Позволяет унифицировать данные независимо от формата источника.
const dbValue = 1700000000000;
const date = toDate(dbValue);
Устраняет необходимость ручного создания new Date() по
всей кодовой базе.
function formatUserDate(input) {
const date = toDate(input);
return date.toISOString();
}
Функция начинает принимать любые распространённые типы дат без дополнительной логики.
Её задача строго техническая: привести к Date.
Подход Date-fns основан на неизменяемости данных. toDate
поддерживает этот принцип, гарантируя:
toDate часто выступает первым шагом:
toDate)isValid)addDays, sub,
differenceIn...)format)Это делает её фундаментальной функцией в цепочке обработки времени.