Получение текущей даты

Работа с текущей датой и временем в JavaScript в контексте библиотеки js-joda строится вокруг неизменяемых типов данных и явного управления часовыми поясами. В отличие от стандартного объекта Date, который сочетает в себе дату, время и системные особенности платформы, js-joda разделяет эти сущности на логически независимые компоненты и требует явного указания контекста времени.

Основным источником текущего времени в js-joda является системные часы, инкапсулированные в объекте Clock. Через него библиотека получает «момент сейчас», который затем преобразуется в конкретные временные типы: локальную дату, дату-время или момент времени в UTC.


Базовое получение текущей даты

Наиболее часто используемый тип — LocalDate, представляющий календарную дату без времени и часового пояса.

import { LocalDate } from '@js-joda/core';

const today = LocalDate.now();

Метод now() возвращает дату в соответствии с системным часовым поясом среды выполнения. Результат содержит только год, месяц и день, без информации о времени суток.

Ключевая особенность:

  • отсутствует время (часы, минуты, секунды)
  • отсутствует часовой пояс
  • результат полностью зависит от системного времени

Текущая дата и время: LocalDateTime

Для сценариев, где требуется объединение даты и времени без привязки к часовому поясу, используется LocalDateTime.

import { LocalDateTime } from '@js-joda/core';

const now = LocalDateTime.now();

Структура включает:

  • календарную дату
  • текущее время до наносекундной точности (в зависимости от платформы)

Особенность модели:

  • не содержит информации о часовом поясе
  • подходит для локальных пользовательских событий (например, время ввода формы, локальные логи)

Получение текущего момента времени (Instant)

Для работы с абсолютным временем используется Instant, который представляет собой точку на временной шкале в формате UTC.

import { Instant } from '@js-joda/core';

const now = Instant.now();

Instant полезен для:

  • хранения временных меток в базе данных
  • сравнения событий между системами
  • логирования

Особенности:

  • всегда в UTC
  • не зависит от локального часового пояса
  • точка на непрерывной временной шкале

Учет часовых поясов: ZonedDateTime

Для получения текущей даты и времени с учетом конкретного часового пояса используется ZonedDateTime.

import { ZonedDateTime, ZoneId } from '@js-joda/core';

const now = ZonedDateTime.now(ZoneId.of('Europe/Moscow'));

Структура включает:

  • локальную дату
  • локальное время
  • идентификатор часового пояса
  • правила перехода на летнее/зимнее время (если применимо)

Основные сценарии:

  • отображение времени пользователю в его регионе
  • работа с международными системами
  • календарные сервисы

Явное использование системных часов (Clock)

Для контроля над источником времени используется Clock. Это важный инструмент при тестировании и моделировании временных сценариев.

import { Clock, Instant, ZoneId } from '@js-joda/core';

const clock = Clock.system(ZoneId.of('UTC'));
const now = Instant.now(clock);

Clock позволяет:

  • фиксировать время (fixed clock)
  • использовать системное время
  • подменять источник времени в тестах

Пример фиксированного времени:

import { Clock, Instant, ZoneId } from '@js-joda/core';

const fixedInstant = Instant.parse('2025-01-01T00:00:00Z');
const clock = Clock.fixed(fixedInstant, ZoneId.of('UTC'));

const now = Instant.now(clock);

В этом случае now всегда возвращает одно и то же значение.


Разница между LocalDate, LocalDateTime и ZonedDateTime

Разделение типов является ключевым принципом js-joda.

LocalDate

  • только дата
  • без времени
  • без часового пояса

LocalDateTime

  • дата + время
  • без часового пояса
  • локальный контекст

ZonedDateTime

  • дата + время + часовой пояс
  • полная временная модель

Пример различий:

LocalDate.now();
LocalDateTime.now();
ZonedDateTime.now();

Каждый вызов использует один и тот же системный момент, но интерпретирует его по-разному.


Работа с конкретной временной зоной

При получении текущего времени часто требуется указать зону явно.

import { ZonedDateTime, ZoneId } from '@js-joda/core';

const tokyoTime = ZonedDateTime.now(ZoneId.of('Asia/Tokyo'));
const londonTime = ZonedDateTime.now(ZoneId.of('Europe/London'));

Особенность:

  • системная зона игнорируется
  • применяется указанная зона
  • корректно учитываются переходы времени

Получение текущей даты через системную зону

Если зона не указана, используется системная временная зона среды выполнения:

import { ZoneId, ZonedDateTime } from '@js-joda/core';

const systemZone = ZoneId.systemDefault();
const now = ZonedDateTime.now(systemZone);

Системная зона зависит от:

  • операционной системы
  • конфигурации окружения
  • настроек Node.js или браузера

Взаимосвязь Instant и ZonedDateTime

Instant представляет момент времени, а ZonedDateTime интерпретирует его в контексте зоны.

Преобразование:

import { Instant, ZoneId, ZonedDateTime } from '@js-joda/core';

const instant = Instant.now();

const zoned = instant.atZone(ZoneId.of('Europe/Moscow'));

Обратное преобразование:

const backToInstant = zoned.toInstant();

Таким образом:

  • Instant — абсолютное время
  • ZonedDateTime — локализованное представление

Использование системного времени в вычислениях

Текущая дата часто используется как отправная точка для арифметики дат.

import { LocalDate } from '@js-joda/core';

const today = LocalDate.now();
const nextWeek = today.plusDays(7);
const previousMonth = today.minusMonths(1);

Особенность:

  • операции не мутируют исходный объект
  • каждый результат создаёт новый экземпляр
  • гарантируется неизменяемость состояния

Поведение в разных средах выполнения

js-joda использует системное время среды:

  • браузер — время устройства пользователя
  • Node.js — время сервера
  • тестовые среды — подменяемый Clock

Это делает получение текущей даты детерминированным относительно окружения, но независимым от глобальных изменяемых объектов.


Точность и ограничения

Точность now() зависит от платформы:

  • JavaScript-движок
  • операционная система
  • доступные системные таймеры

В большинстве случаев:

  • наносекундная часть либо отсутствует, либо округляется
  • точность ограничена миллисекундами

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

Локальные отчёты

const reportDate = LocalDate.now();

Логирование событий

const timestamp = Instant.now();

Планирование по часовой зоне

const eventTime = ZonedDateTime.now(ZoneId.of('Europe/Moscow'));

Пользовательские интерфейсы

const displayTime = LocalDateTime.now();

Особенности проектирования времени в js-joda

Подход библиотеки основан на нескольких принципах:

  • явное разделение понятий даты, времени и зоны
  • отсутствие скрытых преобразований
  • неизменяемость объектов
  • отказ от глобального состояния

Получение текущей даты является частным случаем общего механизма работы с Clock, что позволяет контролировать и переопределять источник времени без изменения бизнес-логики.