Конвертация между единицами измерения

Библиотека 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 предназначен для хранения точного промежутка времени в секундах и наносекундах.

Создание 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

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

Класс 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

Отличие Duration от Period

Duration

Используется для:

  • часов
  • минут
  • секунд
  • миллисекунд
  • наносекунд

Основан на точном количестве секунд.

const duration = Duration.ofHours(24)

Period

Используется для:

  • дней
  • месяцев
  • лет

Основан на календарных значениях.

const period = Period.ofDays(1)

Почему нельзя переводить месяцы в секунды напрямую

Количество дней в месяцах различается:

  • 28
  • 29
  • 30
  • 31

Поэтому Js-joda разделяет:

  • точные временные интервалы (Duration)
  • календарные интервалы (Period)

Попытка трактовать месяц как фиксированное число секунд приводит к логическим ошибкам.


Перевод Duration в ISO-8601

const { Duration } = require('@js-joda/core')

const duration = Duration.ofMinutes(90)

console.log(duration.toString())

Результат:

PT1H30M

Разбор ISO-8601 обратно в Duration

const { Duration } = require('@js-joda/core')

const duration = Duration.parse('PT2H15M')

console.log(duration.toMinutes())

Конвертация Period в строку

const { Period } = require('@js-joda/core')

const period = Period.of(1, 6, 10)

console.log(period.toString())

Результат:

P1Y6M10D

Преобразование даты в эпоху Unix

Unix timestamp в секундах

const { Instant } = require('@js-joda/core')

const instant = Instant.now()

console.log(instant.epochSecond())

Unix timestamp в миллисекундах

const { Instant } = require('@js-joda/core')

const instant = Instant.now()

console.log(instant.toEpochMilli())

Создание Instant из миллисекунд

const { Instant } = require('@js-joda/core')

const instant = Instant.ofEpochMilli(1700000000000)

console.log(instant.toString())

Конвертация между LocalDateTime и Instant

Для преобразования требуется временная зона.

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())

Перевод Instant обратно в LocalDateTime

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()

Метод 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)

Преобразование Duration в часы, минуты и секунды

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 не содержит времени суток, поэтому часы не поддерживаются.


Конвертация с использованием plus()

const {
    LocalDateTime,
    ChronoUnit
} = require('@js-joda/core')

const dateTime = LocalDateTime.now()

const updated = dateTime.plus(
    90,
    ChronoUnit.MINUTES
)

console.log(updated.toString())

Конвертация с использованием minus()

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())

Нормализация Period

const { Period } = require('@js-joda/core')

const period = Period.ofMonths(15)

console.log(period.normalized().toString())

Результат:

P1Y3M

Конвертация между Date и Js-joda

Из JavaScript Date в Instant

const { Instant } = require('@js-joda/core')

const jsDate = new Date()

const instant = Instant.ofEpochMilli(
    jsDate.getTime()
)

console.log(instant.toString())

Из Instant в Date

const { Instant } = require('@js-joda/core')

const instant = Instant.now()

const jsDate = new Date(
    instant.toEpochMilli()
)

console.log(jsDate)