Парсинг ISO-строк

Формат ISO 8601 — международный стандарт представления даты и времени. Большинство API, баз данных, браузеров и серверных приложений используют именно его. Библиотека Day.js умеет автоматически распознавать ISO-строки без подключения дополнительных плагинов.

Типичные ISO-строки:

2025-01-10
2025-01-10T14:30:00
2025-01-10T14:30:00Z
2025-01-10T14:30:00+05:00
2025-01-10T14:30:00.000Z

Создание объекта даты из ISO-строки:

const dayjs = require('dayjs')

const date = dayjs('2025-01-10T14:30:00')

console.log(date.format())

Day.js автоматически определяет формат и создаёт внутренний объект даты.


Парсинг простой ISO-даты

Строка без времени интерпретируется как локальная дата.

const date = dayjs('2025-03-15')

console.log(date.format('YYYY-MM-DD'))

Результат:

2025-03-15

При этом время будет установлено в начало суток:

console.log(date.format('HH:mm:ss'))

Результат:

00:00:00

Парсинг даты и времени

ISO-строка может содержать дату и время одновременно.

const date = dayjs('2025-03-15T18:45:30')

console.log(date.format('YYYY-MM-DD HH:mm:ss'))

Результат:

2025-03-15 18:45:30

Символ T разделяет дату и время согласно стандарту ISO 8601.


Работа с UTC-временем

Суффикс Z указывает, что дата находится в UTC.

const date = dayjs('2025-03-15T18:45:30Z')

console.log(date.format())

Пример результата:

2025-03-15T23:45:30+05:00

Day.js преобразует UTC-время в локальный часовой пояс среды выполнения.


Разница между локальным временем и UTC

Локальное время:

dayjs('2025-03-15T12:00:00')

UTC-время:

dayjs('2025-03-15T12:00:00Z')

Во втором случае используется смещение UTC, поэтому итоговое отображение может отличаться.


Парсинг ISO со смещением часового пояса

ISO допускает указание смещения относительно UTC.

const date = dayjs('2025-03-15T12:00:00+03:00')

console.log(date.format())

Строка +03:00 означает, что время находится в часовом поясе UTC+3.

Другой пример:

const date = dayjs('2025-03-15T12:00:00-04:00')

Здесь используется UTC-4.


Миллисекунды в ISO-строках

Day.js корректно распознаёт миллисекунды.

const date = dayjs('2025-03-15T12:00:00.456Z')

console.log(date.millisecond())

Результат:

456

Проверка валидности ISO-строки

Метод isValid() позволяет проверить корректность даты.

const validDate = dayjs('2025-03-15')

console.log(validDate.isValid())

Результат:

true

Некорректная дата:

const invalidDate = dayjs('2025-15-99')

console.log(invalidDate.isValid())

Результат:

false

Особенности автоматического парсинга

Day.js старается автоматически определить формат строки.

dayjs('2025-03-15')
dayjs('2025-03-15T10:20:30')
dayjs('2025-03-15T10:20:30Z')

Однако неоднозначные строки могут интерпретироваться непредсказуемо:

dayjs('03/04/2025')

Неясно, что означает дата:

  • 3 апреля
  • 4 марта

ISO-формат устраняет подобные проблемы.


ISO как стандарт для API

Большинство REST API возвращают даты именно в ISO-виде.

Пример JSON:

{
  "createdAt": "2025-03-15T10:20:30Z"
}

Обработка ответа:

const response = {
  createdAt: '2025-03-15T10:20:30Z'
}

const createdAt = dayjs(response.createdAt)

console.log(createdAt.format('DD.MM.YYYY HH:mm'))

Парсинг массивов ISO-дат

Частая задача — преобразование списка строк.

const dates = [
  '2025-01-01',
  '2025-02-01',
  '2025-03-01'
]

const parsed = dates.map(date => dayjs(date))

console.log(parsed)

Сортировка ISO-строк

ISO-формат удобен тем, что строки можно сортировать даже без преобразования.

const dates = [
  '2025-03-01',
  '2025-01-01',
  '2025-02-01'
]

dates.sort()

console.log(dates)

Результат:

[
  '2025-01-01',
  '2025-02-01',
  '2025-03-01'
]

Это возможно благодаря структуре:

YYYY-MM-DD

Преобразование ISO в Unix timestamp

const date = dayjs('2025-03-15T12:00:00Z')

console.log(date.valueOf())

Результат:

1742040000000

Метод valueOf() возвращает количество миллисекунд с 1 января 1970 года.


Получение ISO-строки обратно

Метод toISOString() преобразует объект Day.js обратно в ISO.

const date = dayjs()

console.log(date.toISOString())

Пример результата:

2025-03-15T09:20:30.000Z

Использование UTC-плагина

Для полноценной работы с UTC используется плагин utc.

Подключение:

const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')

dayjs.extend(utc)

Создание UTC-даты:

const date = dayjs.utc('2025-03-15T12:00:00Z')

console.log(date.format())

Разница между dayjs() и dayjs.utc()

dayjs('2025-03-15T12:00:00Z')

Создаёт локальное представление даты.

dayjs.utc('2025-03-15T12:00:00Z')

Сохраняет дату в UTC-режиме.

Это влияет на:

  • форматирование;
  • вычисления;
  • сравнение дат;
  • отображение времени.

Сравнение ISO-дат

const first = dayjs('2025-01-01')
const second = dayjs('2025-02-01')

console.log(first.isBefore(second))

Результат:

true

Проверка равенства:

console.log(first.isSame(second))

Разница между датами

const start = dayjs('2025-01-01')
const end = dayjs('2025-01-10')

console.log(end.diff(start, 'day'))

Результат:

9

Парсинг ISO с timezone-плагином

Для работы с конкретными часовыми поясами используется плагин timezone.

Установка:

npm install dayjs

Подключение:

const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const timezone = require('dayjs/plugin/timezone')

dayjs.extend(utc)
dayjs.extend(timezone)

Парсинг:

const date = dayjs.tz(
  '2025-03-15T12:00:00',
  'Europe/Moscow'
)

console.log(date.format())

Форматы ISO, поддерживаемые Day.js

Только дата

2025-03-15

Дата и время

2025-03-15T12:30:00

UTC

2025-03-15T12:30:00Z

Со смещением

2025-03-15T12:30:00+03:00

С миллисекундами

2025-03-15T12:30:00.123Z

Типичные ошибки при парсинге

Отсутствие Z

dayjs('2025-03-15T12:00:00')

Дата считается локальной.


Неверное смещение

dayjs('2025-03-15T12:00:00+99:00')

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


Неполная ISO-строка

dayjs('2025-03')

Результат зависит от среды выполнения и не всегда предсказуем.


Рекомендации по работе с ISO

  • использовать полный ISO-формат;
  • хранить даты в UTC;
  • передавать даты между сервером и клиентом в ISO;
  • всегда проверять isValid();
  • явно указывать часовой пояс;
  • избегать локальных строк вида 15.03.2025.

Преимущества ISO-формата

  • международный стандарт;
  • отсутствие неоднозначности;
  • совместимость с API;
  • поддержка браузерами;
  • удобная сортировка;
  • корректная работа с часовыми поясами;
  • стабильный парсинг в Day.js.