Функция parseISO из библиотеки date-fns предназначена
для строгого разбора строк в формате ISO 8601 и преобразования их в
объект Date.
В отличие от стандартного конструктора Date, который
может по-разному интерпретировать строки в зависимости от браузера и
окружения, parseISO обеспечивает предсказуемое поведение и
корректную обработку ISO-дат.
import { parseISO } from 'date-fns'
const date = parseISO('2025-03-15')
console.log(date)
Результат:
2025-03-15T00:00:00.000Z
parseISO предпочтительнее new Date()Стандартный JavaScript-парсер дат обладает рядом проблем:
new Date('2025-03-15')
В разных средах:
parseISO решает эти проблемы:
import { parseISO } from 'date-fns'
const date = parseISO('2025-03-15')
Основные преимущества:
parseISO поддерживает различные варианты ISO-строк.
parseISO('2025-03-15')
parseISO('2025-03-15T14:30:00')
parseISO('2025-03-15T14:30:00Z')
Суффикс Z означает UTC.
parseISO('2025-03-15T14:30:00+05:00')
parseISO('2025-03-15T14:30:00.123Z')
parseISO возвращает обычный объект
Date.
import { parseISO } from 'date-fns'
const date = parseISO('2025-03-15')
console.log(date instanceof Date)
Результат:
true
После разбора можно использовать любые функции JavaScript или
date-fns.
import { format, parseISO } from 'date-fns'
const date = parseISO('2025-03-15')
console.log(format(date, 'dd.MM.yyyy'))
Строка без указания часового пояса считается локальным временем.
parseISO('2025-03-15T10:00:00')
Если система работает в UTC+6, время останется локальным:
2025-03-15 10:00:00
При наличии Z дата трактуется как UTC.
parseISO('2025-03-15T10:00:00Z')
В локальной временной зоне значение будет преобразовано автоматически.
Например, для UTC+6:
2025-03-15 16:00:00
ISO допускает указание смещения.
parseISO('2025-03-15T10:00:00+03:00')
Внутри объект Date всегда хранит UTC-время.
Если строка не соответствует ISO-формату, возвращается
Invalid Date.
const date = parseISO('hello')
console.log(date)
Результат:
Invalid Date
isValidДля проверки используется функция isValid.
import { parseISO, isValid } from 'date-fns'
const date = parseISO('invalid')
console.log(isValid(date))
Результат:
false
parseISO намеренно отвергает неоднозначные строки.
parseISO('15/03/2025')
Результат:
Invalid Date
parseISO('2025/03/15')
Результат:
Invalid Date
parseISO('March 15 2025')
Результат:
Invalid Date
parseISO от
parseФункция parse используется для произвольных
форматов.
import { parse } from 'date-fns'
parse('15.03.2025', 'dd.MM.yyyy', new Date())
parseISO предназначена только для ISO 8601.
parseISO('2025-03-15')
parseISOБольшинство REST API передают даты именно в ISO-формате.
{
"createdAt": "2025-03-15T12:00:00Z"
}
Разбор:
const createdAt = parseISO(data.createdAt)
Многие СУБД возвращают ISO-строки:
ISO является стандартом обмена датами между сервисами.
ISO широко используется:
import { parseISO, format } from 'date-fns'
const response = {
publishedAt: '2025-08-10T14:00:00Z'
}
const date = parseISO(response.publishedAt)
console.log(
format(date, 'dd.MM.yyyy HH:mm')
)
Нельзя предполагать, что дата всегда корректна.
import { parseISO, isValid } from 'date-fns'
function parseApiDate(value) {
const date = parseISO(value)
if (!isValid(date)) {
throw new Error('Некорректная дата')
}
return date
}
import { parseISO } from 'date-fns'
const dates = [
'2025-01-01',
'2025-02-01',
'2025-03-01'
]
const parsed = dates.map(parseISO)
console.log(parsed)
formatОдна из самых частых связок:
import { parseISO, format } from 'date-fns'
const date = parseISO('2025-03-15')
const formatted = format(date, 'dd MMM yyyy')
console.log(formatted)
differenceInDaysimport {
parseISO,
differenceInDays
} from 'date-fns'
const start = parseISO('2025-03-01')
const end = parseISO('2025-03-15')
console.log(
differenceInDays(end, start)
)
compareAscimport {
parseISO,
compareAsc
} from 'date-fns'
const result = compareAsc(
parseISO('2025-01-01'),
parseISO('2025-06-01')
)
console.log(result)
isAfterimport {
parseISO,
isAfter
} from 'date-fns'
const result = isAfter(
parseISO('2025-12-01'),
parseISO('2025-01-01')
)
console.log(result)
parseISO('2025-03-15')
Время автоматически устанавливается:
00:00:00
parseISO требует дату.
Некорректно:
parseISO('10:30:00')
ISO поддерживает недельный формат.
parseISO('2025-W10')
Поддерживается ordinal date.
parseISO('2025-074')
74-й день года.
parseISO('2025-03-15T12:00:00')
Интерпретируется как локальное время.
parseISO('2025-03-15T12:00:00Z')
Интерпретируется как UTC.
parseISO('2025-03-15T12:00:00+02:00')
Интерпретируется относительно указанной зоны.
Объект Date хранит timestamp в UTC.
const date = parseISO('2025-03-15T10:00:00+03:00')
console.log(date.getTime())
Invalid DateНикогда не следует проверять так:
if (date === 'Invalid Date')
Правильный способ:
isValid(date)
Ошибка:
parseISO('15.03.2025')
Правильно:
parse('15.03.2025', 'dd.MM.yyyy', new Date())
Ошибка:
parseISO('2025-03-15T10:00:00')
Без указания зоны время может интерпретироваться неверно при обмене между сервером и клиентом.
Предпочтительно:
parseISO('2025-03-15T10:00:00Z')
Ошибка:
const date = parseISO(value)
console.log(format(date, 'dd.MM.yyyy'))
Без проверки возможен runtime error.
Правильно:
const date = parseISO(value)
if (isValid(date)) {
console.log(format(date, 'dd.MM.yyyy'))
}
import {
parseISO,
compareDesc
} from 'date-fns'
const posts = [
{
title: 'Post 1',
publishedAt: '2025-01-10T10:00:00Z'
},
{
title: 'Post 2',
publishedAt: '2025-02-15T09:00:00Z'
}
]
posts.sort((a, b) =>
compareDesc(
parseISO(a.publishedAt),
parseISO(b.publishedAt)
)
)
console.log(posts)
import {
parseISO,
isAfter
} from 'date-fns'
const expiresAt = parseISO(
'2025-12-31T23:59:59Z'
)
const expired = isAfter(
new Date(),
expiresAt
)
console.log(expired)
import {
parseISO,
isFuture
} from 'date-fns'
const events = [
{
name: 'Conference',
date: '2026-01-10T12:00:00Z'
},
{
name: 'Meetup',
date: '2024-01-10T12:00:00Z'
}
]
const futureEvents = events.filter(event =>
isFuture(parseISO(event.date))
)
console.log(futureEvents)
parseISO работает быстрее универсального
parse, поскольку:
parseISOФункция не предназначена для:
15.03.2025.Для таких случаев применяется parse.
import { parseISO } from 'date-fns'
const date: Date = parseISO(
'2025-03-15'
)
import {
parseISO,
isValid
} from 'date-fns'
export function safeParseISO(value) {
const date = parseISO(value)
return isValid(date)
? date
: null
}
function parseNullableDate(value) {
if (!value) {
return null
}
const date = parseISO(value)
return isValid(date)
? date
: null
}
import { parseISO, format } from 'date-fns'
function PostDate({ value }) {
const date = parseISO(value)
return (
<time>
{format(date, 'dd.MM.yyyy')}
</time>
)
}
import { parseISO } from 'date-fns'
const timestamp =
process.env.EXPIRES_AT
const date = parseISO(timestamp)
parseISO не работает с timestamp.
Неправильно:
parseISO(1710000000000)
Для timestamp:
new Date(1710000000000)
или:
fromUnixTime(1710000000)
parseISO
и Date.parseDate.parseDate.parse('2025-03-15')
Возвращает timestamp.
parseISOparseISO('2025-03-15')
Возвращает объект Date.
parseISO('')
Результат:
Invalid Date
undefinedparseISO(undefined)
Результат:
Invalid Date
nullparseISO(null)
Результат:
Invalid Date
Использовать ISO с UTC:
2025-03-15T10:00:00Z
Предпочтительно хранить даты в UTC.
Преобразовывать через format.
Всегда использовать isValid.
ISO string
↓
parseISO()
↓
Date object
↓
format / compare / filter / math