Библиотека Js-joda использует строгую модель работы со временем,
основанную на стандарте Java Time API. В отличие от встроенного объекта
Date, здесь отсутствуют неявные преобразования и
неоднозначные вычисления. Конвертация между единицами времени
выполняется через специализированные классы и методы.
Основные единицы измерения представлены перечислением
ChronoUnit:
const { ChronoUnit } = require('@js-joda/core')
console.log(ChronoUnit.SECONDS)
console.log(ChronoUnit.MINUTES)
console.log(ChronoUnit.HOURS)
console.log(ChronoUnit.DAYS)
Поддерживаются как точные единицы времени:
так и календарные:
DurationКласс Duration предназначен для хранения точного
промежутка времени в секундах и наносекундах.
const { Duration } = require('@js-joda/core')
const duration = Duration.ofHours(5)
console.log(duration.toMinutes()) // 300
console.log(duration.toSeconds()) // 18000
const { Duration } = require('@js-joda/core')
const duration = Duration.ofHours(2)
const minutes = duration.toMinutes()
console.log(minutes)
Результат:
120
const { Duration } = require('@js-joda/core')
const duration = Duration.ofMinutes(15)
console.log(duration.seconds())
Результат:
900
Метод toMillis() выполняет точное преобразование
временного промежутка.
const { Duration } = require('@js-joda/core')
const duration = Duration.ofSeconds(10)
console.log(duration.toMillis())
Результат:
10000
Js-joda поддерживает высокоточную временную арифметику.
const { Duration } = require('@js-joda/core')
const duration = Duration.ofNanos(5000000)
console.log(duration.toMillis())
Результат:
5
ChronoUnit позволяет вычислять разницу между датами и
временем в конкретных единицах.
const { LocalDate, ChronoUnit } = require('@js-joda/core')
const start = LocalDate.parse('2025-01-01')
const end = LocalDate.parse('2025-01-20')
const days = ChronoUnit.DAYS.between(start, end)
console.log(days)
const { LocalDateTime, ChronoUnit } = require('@js-joda/core')
const start = LocalDateTime.parse('2025-01-01T10:00')
const end = LocalDateTime.parse('2025-01-01T18:30')
const hours = ChronoUnit.HOURS.between(start, end)
console.log(hours)
Результат:
8
Метод возвращает только полные единицы измерения.
const { LocalTime, ChronoUnit } = require('@js-joda/core')
const start = LocalTime.parse('10:00')
const end = LocalTime.parse('11:45')
console.log(
ChronoUnit.MINUTES.between(start, end)
)
Результат:
105
Класс Period используется для календарных единиц
времени.
const { Period } = require('@js-joda/core')
const period = Period.of(1, 2, 15)
console.log(period.years()) // 1
console.log(period.months()) // 2
console.log(period.days()) // 15
Используется для:
Основан на точном количестве секунд.
const duration = Duration.ofHours(24)
Используется для:
Основан на календарных значениях.
const period = Period.ofDays(1)
Количество дней в месяцах различается:
Поэтому Js-joda разделяет:
Duration)Period)Попытка трактовать месяц как фиксированное число секунд приводит к логическим ошибкам.
const { Duration } = require('@js-joda/core')
const duration = Duration.ofMinutes(90)
console.log(duration.toString())
Результат:
PT1H30M
const { Duration } = require('@js-joda/core')
const duration = Duration.parse('PT2H15M')
console.log(duration.toMinutes())
const { Period } = require('@js-joda/core')
const period = Period.of(1, 6, 10)
console.log(period.toString())
Результат:
P1Y6M10D
const { Instant } = require('@js-joda/core')
const instant = Instant.now()
console.log(instant.epochSecond())
const { Instant } = require('@js-joda/core')
const instant = Instant.now()
console.log(instant.toEpochMilli())
const { Instant } = require('@js-joda/core')
const instant = Instant.ofEpochMilli(1700000000000)
console.log(instant.toString())
Для преобразования требуется временная зона.
const {
LocalDateTime,
ZoneId
} = require('@js-joda/core')
const dateTime = LocalDateTime.parse('2025-06-01T12:00')
const zoned = dateTime.atZone(
ZoneId.of('Europe/Moscow')
)
const instant = zoned.toInstant()
console.log(instant.toString())
const {
Instant,
LocalDateTime,
ZoneId
} = require('@js-joda/core')
const instant = Instant.now()
const localDateTime = LocalDateTime.ofInstant(
instant,
ZoneId.of('Europe/Moscow')
)
console.log(localDateTime.toString())
const {
ZonedDateTime,
ZoneId
} = require('@js-joda/timezone')
const tokyo = ZonedDateTime.now(
ZoneId.of('Asia/Tokyo')
)
const london = tokyo.withZoneSameInstant(
ZoneId.of('Europe/London')
)
console.log(tokyo.toString())
console.log(london.toString())
Метод until() вычисляет разницу между объектами во
временных единицах.
const {
LocalDate,
ChronoUnit
} = require('@js-joda/core')
const start = LocalDate.parse('2025-01-01')
const end = LocalDate.parse('2025-12-31')
const months = start.until(
end,
ChronoUnit.MONTHS
)
console.log(months)
const { Duration } = require('@js-joda/core')
const duration = Duration.ofSeconds(3675)
const hours = Math.floor(duration.toHours())
const minutes = Math.floor(duration.toMinutes() % 60)
const seconds = duration.seconds() % 60
console.log(hours)
console.log(minutes)
console.log(seconds)
Результат:
1
1
15
Js-joda не выполняет автоматическое округление.
const { Duration } = require('@js-joda/core')
const duration = Duration.ofSeconds(95)
console.log(duration.toMinutes())
Результат:
1
Возвращается только полное количество минут.
const {
LocalDate,
ChronoUnit
} = require('@js-joda/core')
const date = LocalDate.now()
console.log(
date.isSupported(ChronoUnit.DAYS)
)
console.log(
date.isSupported(ChronoUnit.HOURS)
)
Результат:
true
false
LocalDate не содержит времени суток, поэтому часы не
поддерживаются.
const {
LocalDateTime,
ChronoUnit
} = require('@js-joda/core')
const dateTime = LocalDateTime.now()
const updated = dateTime.plus(
90,
ChronoUnit.MINUTES
)
console.log(updated.toString())
const {
LocalDateTime,
ChronoUnit
} = require('@js-joda/core')
const dateTime = LocalDateTime.now()
const updated = dateTime.minus(
2,
ChronoUnit.HOURS
)
console.log(updated.toString())
const {
LocalDate,
ChronoUnit
} = require('@js-joda/core')
const date = LocalDate.now()
console.log(
date.plus(1, ChronoUnit.DECADES)
)
console.log(
date.plus(1, ChronoUnit.CENTURIES)
)
const { Duration } = require('@js-joda/core')
const duration = Duration.ofNanos(2500000)
console.log(duration.toNanos())
Результат:
2500000
Для перевода в микросекунды:
const micros = duration.toNanos() / 1000
console.log(micros)
const { LocalDate } = require('@js-joda/core')
const date = LocalDate.parse('2025-01-31')
console.log(
date.plusMonths(1).toString()
)
Результат:
2025-02-28
Js-joda корректно адаптирует дату под длину месяца.
Библиотека избегает типичных ошибок Jav * aScript:
Все преобразования выполняются явно и предсказуемо.
const {
Duration,
Instant
} = require('@js-joda/core')
const start = Instant.now()
setTimeout(() => {
const end = Instant.now()
const duration = Duration.between(start, end)
console.log(duration.toMillis())
}, 1500)
Пример измеряет длительность выполнения операции в миллисекундах.
const {
ChronoUnit
} = require('@js-joda/core')
console.log(
ChronoUnit.HOURS.duration().toMinutes()
)
console.log(
ChronoUnit.DAYS.duration().toHours()
)
Результат:
60
24
const { Duration } = require('@js-joda/core')
const duration = Duration.ofMinutes(30)
console.log(duration.isZero())
console.log(duration.isNegative())
const { Period } = require('@js-joda/core')
const period = Period.ofMonths(15)
console.log(period.normalized().toString())
Результат:
P1Y3M
const { Instant } = require('@js-joda/core')
const jsDate = new Date()
const instant = Instant.ofEpochMilli(
jsDate.getTime()
)
console.log(instant.toString())
const { Instant } = require('@js-joda/core')
const instant = Instant.now()
const jsDate = new Date(
instant.toEpochMilli()
)
console.log(jsDate)