js-joda — библиотека для работы с датой и временем в
JavaScript, основанная на концепциях java.time из Java 8.
Главная цель библиотеки — предоставить строгую, предсказуемую и
безопасную модель времени без типичных проблем стандартного объекта
Date.
Ключевые особенности:
Библиотека состоит из нескольких основных типов:
| Тип | Назначение |
|---|---|
LocalDate |
Только дата |
LocalTime |
Только время |
LocalDateTime |
Дата и время без часового пояса |
ZonedDateTime |
Дата, время и временная зона |
Instant |
Точка времени UTC |
Duration |
Длительность |
Period |
Период между датами |
Установка через npm:
npm install @js-joda/core
Подключение:
const {
LocalDate,
LocalTime,
LocalDateTime,
ZonedDateTime,
Instant,
ZoneId
} = require('@js-joda/core');
Для ES-модулей:
import {
LocalDate,
LocalTime,
LocalDateTime
} from '@js-joda/core';
LocalDate хранит только календарную дату:
const date = LocalDate.of(2026, 5, 24);
console.log(date.toString());
Результат:
2026-05-24
LocalDate.of(year, month, day)
| Параметр | Описание |
|---|---|
year |
Год |
month |
Месяц |
day |
День месяца |
Месяц можно задавать через enum Month:
import { LocalDate, Month } from '@js-joda/core';
const date = LocalDate.of(2026, Month.MAY, 24);
console.log(date.toString());
Это делает код более читаемым и исключает ошибки при указании номера месяца.
Метод now() возвращает текущую дату:
const today = LocalDate.now();
console.log(today.toString());
Дата определяется на основе системного времени.
Парсинг ISO-строки:
const date = LocalDate.parse('2026-05-24');
console.log(date.toString());
Формат ISO-8601 поддерживается по умолчанию.
LocalTime представляет только время без даты.
const time = LocalTime.of(14, 30, 15);
console.log(time.toString());
Результат:
14:30:15
js-joda поддерживает наносекундную точность.
const time = LocalTime.of(10, 15, 30, 500000000);
console.log(time.toString());
Результат:
10:15:30.500
Параметры:
LocalTime.of(hour, minute, second, nano)
const now = LocalTime.now();
console.log(now.toString());
const time = LocalTime.parse('18:45:10');
console.log(time.toString());
LocalDateTime объединяет дату и время.
const dateTime = LocalDateTime.of(
2026,
5,
24,
18,
30,
45
);
console.log(dateTime.toString());
Результат:
2026-05-24T18:30:45
const date = LocalDate.of(2026, 5, 24);
const time = LocalTime.of(12, 15);
const dateTime = LocalDateTime.of(date, time);
console.log(dateTime.toString());
const current = LocalDateTime.now();
console.log(current.toString());
const value = LocalDateTime.parse(
'2026-05-24T21:15:30'
);
console.log(value.toString());
Instant представляет абсолютную временную точку UTC.
const instant = Instant.now();
console.log(instant.toString());
Пример результата:
2026-05-24T10:22:15.123Z
Суффикс Z означает UTC.
const instant = Instant.parse(
'2026-05-24T10:15:30Z'
);
console.log(instant.toString());
ZonedDateTime хранит:
const zoned = ZonedDateTime.now();
console.log(zoned.toString());
const tokyo = ZonedDateTime.now(
ZoneId.of('Asia/Tokyo')
);
console.log(tokyo.toString());
const zoned = ZonedDateTime.of(
2026,
5,
24,
15,
45,
30,
0,
ZoneId.of('Europe/Berlin')
);
console.log(zoned.toString());
Для полноценной поддержки временных зон требуется дополнительный пакет:
npm install @js-joda/timezone
Подключение:
require('@js-joda/timezone');
После подключения становятся доступны IANA-зоны:
ZoneId.of('Europe/Moscow');
ZoneId.of('America/New_York');
ZoneId.of('Asia/Almaty');
Duration описывает длительность времени.
import { Duration } from '@js-joda/core';
const duration = Duration.ofHours(5);
console.log(duration.toString());
Результат:
PT5H
const duration = Duration.ofMinutes(90);
console.log(duration.toString());
const duration = Duration.ofSeconds(45);
console.log(duration.toString());
Period хранит календарный период.
import { Period } from '@js-joda/core';
const period = Period.of(1, 2, 15);
console.log(period.toString());
Результат:
P1Y2M15D
Параметры:
Period.of(years, months, days)
Большинство объектов поддерживают статический метод
parse.
LocalDate.parse('2026-05-24');
LocalTime.parse('10:15:30');
LocalDateTime.parse(
'2026-05-24T10:15:30'
);
Instant.parse(
'2026-05-24T10:15:30Z'
);
Стандартный Date:
js-joda позволяет безопасно конвертировать значения.
const jsDate = new Date();
const instant = Instant.ofEpochMilli(
jsDate.getTime()
);
console.log(instant.toString());
const instant = Instant.now();
const jsDate = new Date(
instant.toEpochMilli()
);
console.log(jsDate);
const instant = Instant.ofEpochMilli(
1760000000000
);
console.log(instant.toString());
const instant = Instant.ofEpochSecond(
1760000000
);
console.log(instant.toString());
В библиотеке активно используются статические фабрики.
Основные методы:
| Метод | Назначение |
|---|---|
of() |
Создание из компонентов |
now() |
Текущее время |
parse() |
Создание из строки |
from() |
Создание из другого temporal-объекта |
const dateTime = LocalDateTime.parse(
'2026-05-24T12:30:00'
);
const date = LocalDate.from(dateTime);
console.log(date.toString());
const instant = Instant.ofEpochSecond(
1000,
500000000
);
console.log(instant.toString());
Второй параметр — наносекунды.
Все типы js-joda immutable.
const date = LocalDate.of(2026, 5, 24);
const changed = date.plusDays(5);
console.log(date.toString());
console.log(changed.toString());
Результат:
2026-05-24
2026-05-29
Исходный объект не изменяется.
const min = LocalTime.MIN;
const max = LocalTime.MAX;
const start = LocalTime.MIDNIGHT;
const noon = LocalTime.NOON;
const epoch = LocalDate.ofEpochDay(0);
console.log(epoch.toString());
Результат:
1970-01-01
const time = LocalTime.ofSecondOfDay(
3600
);
console.log(time.toString());
Результат:
01:00
const time = LocalTime.ofNanoOfDay(
5000000000
);
console.log(time.toString());
const date = LocalDate.ofYearDay(
2026,
150
);
console.log(date.toString());
Некорректные значения вызывают исключения.
LocalDate.of(2026, 15, 10);
Ошибка:
DateTimeException
LocalDate.of(2026, 2, 30);
LocalDate.parse('24-05-2026');
Часто используется try/catch.
try {
const date = LocalDate.parse(
'2026-15-99'
);
} catch (error) {
console.log(error.message);
}
Clock позволяет управлять источником времени.
import {
Clock,
Instant,
ZoneId
} from '@js-joda/core';
const clock = Clock.systemUTC();
const now = Instant.now(clock);
console.log(now.toString());
Полезно для тестирования.
const fixedClock = Clock.fixed(
Instant.parse(
'2026-05-24T10:00:00Z'
),
ZoneId.UTC
);
const now = Instant.now(fixedClock);
console.log(now.toString());
Clock.systemUTC();
Clock.systemDefaultZone();
const date = LocalDate
.parse('2026-05-24');
const dateTime = date.atTime(18, 30);
console.log(dateTime.toString());
const local = LocalDateTime.of(
2026,
5,
24,
12,
0
);
const zoned = local.atZone(
ZoneId.of('Europe/Paris')
);
console.log(zoned.toString());
Все базовые методы ориентированы на ISO-8601:
YYYY-MM-DD
YYYY-MM-DDTHH:mm:ss
YYYY-MM-DDTHH:mm:ssZ
Примеры:
2026-05-24
2026-05-24T18:30:00
2026-05-24T18:30:00Z
import {
LocalDate,
LocalTime,
LocalDateTime,
ZonedDateTime,
ZoneId
} from '@js-joda/core';
require('@js-joda/timezone');
const date = LocalDate.of(
2026,
5,
24
);
const time = LocalTime.of(
14,
45,
30
);
const dateTime = LocalDateTime.of(
date,
time
);
const zoned = dateTime.atZone(
ZoneId.of('Asia/Almaty')
);
console.log(zoned.toString());
Результат:
2026-05-24T14:45:30+05:00[Asia/Almaty]