Библиотека Js-joda предоставляет современную модель работы с датой и
временем, основанную на API java.time из Java. В отличие от
стандартного объекта Date, библиотека разделяет понятия
локального времени, даты, временной зоны и момента времени. Это
позволяет получать текущее время предсказуемо и без скрытых
преобразований.
Для получения текущего локального времени используется класс
LocalTime.
const { LocalTime } = require('@js-joda/core');
const time = LocalTime.now();
console.log(time.toString());
Пример результата:
14:35:12.847
LocalTimeКласс хранит только время суток:
Дата и часовой пояс отсутствуют.
const { LocalTime } = require('@js-joda/core');
const now = LocalTime.now();
console.log(now.hour());
console.log(now.minute());
console.log(now.second());
console.log(now.nano());
Результат:
14
35
12
847000000
Для получения текущей даты используется LocalDate.
const { LocalDate } = require('@js-joda/core');
const today = LocalDate.now();
console.log(today.toString());
Пример:
2026-05-24
console.log(today.year());
console.log(today.monthValue());
console.log(today.dayOfMonth());
Наиболее часто используется класс LocalDateTime.
const { LocalDateTime } = require('@js-joda/core');
const now = LocalDateTime.now();
console.log(now.toString());
Пример результата:
2026-05-24T14:42:10.215
LocalDateTimeОбъект включает:
При этом информация о часовом поясе отсутствует.
Для работы с временными зонами применяется
ZonedDateTime.
const { ZonedDateTime } = require('@js-joda/core');
const zoned = ZonedDateTime.now();
console.log(zoned.toString());
Пример:
2026-05-24T14:45:33.112+05:00[Asia/Qyzylorda]
Такой объект содержит:
Для полноценной работы с часовыми поясами требуется пакет:
npm install @js-joda/timezone
require('@js-joda/timezone');
const {
ZonedDateTime,
ZoneId
} = require('@js-joda/core');
const tokyo = ZonedDateTime.now(
ZoneId.of('Asia/Tokyo')
);
console.log(tokyo.toString());
Пример:
2026-05-24T18:52:11.551+09:00[Asia/Tokyo]
UTC используется для хранения времени в базах данных, API и распределённых системах.
require('@js-joda/timezone');
const {
ZonedDateTime,
ZoneOffset
} = require('@js-joda/core');
const utcNow = ZonedDateTime.now(
ZoneOffset.UTC
);
console.log(utcNow.toString());
Результат:
2026-05-24T09:55:20.331Z
InstantInstant представляет точку на временной шкале UTC.
const { Instant } = require('@js-joda/core');
const now = Instant.now();
console.log(now.toString());
Пример:
2026-05-24T09:57:44.281Z
InstantInstant подходит для:
| Класс | Содержит дату | Содержит время | Содержит timezone |
|---|---|---|---|
LocalDate |
Да | Нет | Нет |
LocalTime |
Нет | Да | Нет |
LocalDateTime |
Да | Да | Нет |
ZonedDateTime |
Да | Да | Да |
Instant |
Да | Да | UTC |
Instantconst { Instant } = require('@js-joda/core');
const millis = Instant.now().toEpochMilli();
console.log(millis);
Пример:
1779617000000
const { Instant } = require('@js-joda/core');
const timestamp = Instant.now().epochSecond();
console.log(timestamp);
Каждый вызов now() создаёт новый объект.
const { LocalTime } = require('@js-joda/core');
console.log(LocalTime.now().toString());
setTimeout(() => {
console.log(LocalTime.now().toString());
}, 2000);
Пример:
14:10:01.331
14:10:03.334
ClockКласс Clock позволяет управлять временем приложения.
const {
Clock,
LocalDateTime,
ZoneId
} = require('@js-joda/core');
const clock = Clock.system(
ZoneId.of('Europe/Berlin')
);
const now = LocalDateTime.now(clock);
console.log(now.toString());
ClockИспользование Clock полезно для:
const {
Clock,
Instant,
ZoneOffset,
LocalDateTime
} = require('@js-joda/core');
const fixedClock = Clock.fixed(
Instant.parse('2026-01-01T00:00:00Z'),
ZoneOffset.UTC
);
const now = LocalDateTime.now(fixedClock);
console.log(now.toString());
Результат всегда будет одинаковым:
2026-01-01T00:00
const {
ZoneId,
ZonedDateTime
} = require('@js-joda/core');
const systemZone = ZoneId.systemDefault();
const now = ZonedDateTime.now(systemZone);
console.log(systemZone.toString());
console.log(now.toString());
const { ZoneId } = require('@js-joda/core');
const zone = ZoneId.systemDefault();
console.log(zone.id());
Пример:
Asia/Almaty
DateTimeFormatterconst {
LocalDateTime,
DateTimeFormatter
} = require('@js-joda/core');
const now = LocalDateTime.now();
const formatter = DateTimeFormatter.ofPattern(
'dd.MM.yyyy HH:mm:ss'
);
console.log(now.format(formatter));
Результат:
24.05.2026 14:22:18
const {
LocalTime,
DateTimeFormatter
} = require('@js-joda/core');
const time = LocalTime.now();
const formatter = DateTimeFormatter.ofPattern(
'HH:mm'
);
console.log(time.format(formatter));
Пример:
14:27
Js-joda поддерживает наносекундную точность.
const { LocalTime } = require('@js-joda/core');
const now = LocalTime.now();
console.log(now.nano());
const {
LocalDateTime,
ChronoUnit
} = require('@js-joda/core');
const now = LocalDateTime.now();
const truncated = now.truncatedTo(
ChronoUnit.SECONDS
);
console.log(truncated.toString());
Результат:
2026-05-24T14:33:50
Date и
Js-jodaDateconst now = new Date();
console.log(now);
Объект Date одновременно хранит:
Это приводит к неоднозначному поведению при преобразованиях.
Библиотека разделяет разные типы времени:
Такой подход делает код:
const {
ZonedDateTime,
DateTimeFormatter
} = require('@js-joda/core');
require('@js-joda/timezone');
const formatter = DateTimeFormatter.ofPattern(
'yyyy-MM-dd HH:mm:ss'
);
const startedAt = ZonedDateTime.now();
console.log(
`Application started at ${
startedAt.format(formatter)
}`
);
LocalDateTime вместо InstantНеверно:
const createdAt = LocalDateTime.now();
Для хранения времени в БД лучше использовать:
const createdAt = Instant.now();
Неверно:
LocalDateTime.now();
Для международных приложений предпочтительнее:
ZonedDateTime.now();
или:
Instant.now();
| Сценарий | Рекомендуемый класс |
|---|---|
| Только дата | LocalDate |
| Только время | LocalTime |
| Локальная дата и время | LocalDateTime |
| Время с timezone | ZonedDateTime |
| Timestamp и серверное время | Instant |
| Тестируемое время | Clock |