js-joda конвертирует дату и время в зонах UTC в локальное время и дату

Я изо всех сил пытаюсь преобразовать проанализированное время даты и времени UTC в LocalDateTime (America/New_York), с соответствующим образом скорректированными часами между двумя часовыми поясами, используя библиотеку.

В собственном объекте Date javascript то, что хранится, находится в формате UTC и корректируется для локального (системного) часового пояса во время отображения (, и т. д). Я понимаю, что работает по-другому, поэтому я предполагаю, что это мое собственное непонимание того, какчасовые пояса работают. Несмотря на это, я не могу получить какой-либо DateTime, чтобы сообщить/показать, что в Нью-Йорке 8 утра, учитывая время UTC в 12 часов дня.

Ниже приведен тестовый код Jest, чтобы показать, что было предпринято до сих пор.

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

// (Jest tests)
test('converting a utc zoned-datetime into a local datetime', () => {

    expect(ZoneId.systemDefault().id().toString()).toMatch('America/New_York');

    // America/New_York is currently -04:00 from UTC (daylight savings on)

    const utcStr1 = "2022-09-27T12:00:00Z";
    const utcStr2 = "2022-09-27T12:00:00+00:00";

    const utcDT = ZonedDateTime.parse(utcStr1);

    // make sure I understand how parsing UTC forms work:
    expect(utcDT).toEqual(ZonedDateTime.parse(utcStr2));  // OK
    expect(utcDT.zone().id()).toEqual(ZoneId.UTC.id());   // OK

    // trying to parse a UTC datetime string using LocalDateTime fails, 
    // so that won't work...
    expect(() => LocalDateTime.parse("2022-09-27T12:00:00Z")).toThrow(DateTimeParseException);
    expect(() => LocalDateTime.parse("2022-09-27T12:00:00+00:00")).toThrow(DateTimeParseException);

    /*
        How do I convert this UTC datetime into a LocalDateTime, adjusting for UTC (hr:12) -> America/New_York (hr:8)?
        All of the below attempts fail, returning 12.
     */

    expect(utcDT.toOffsetDateTime().hour()).toEqual(8); // FAILS: .hour() returns 12 not 8
    expect(utcDT.toLocalDateTime().hour()).toEqual(8);  // FAILS: .hour() returns 12 not 8
    expect(utcDT.withZoneSameLocal(ZoneId.systemDefault()).hour()).toEqual(8);  // FAILS: .hour() returns 12 not 8

});

1 ответ

Функция для использованияwithZoneSameInstant:

      const localDateTime = utcDT.withZoneSameInstant(ZoneId.systemDefault());
Другие вопросы по тегам