js-joda конвертирует дату и время в зонах UTC в локальное время и дату
Я изо всех сил пытаюсь преобразовать проанализированное время даты и времени UTC в LocalDateTime (America/New_York), с соответствующим образом скорректированными часами между двумя часовыми поясами, используя библиотеку.
В собственном объекте Date javascript то, что хранится, находится в формате UTC и корректируется для локального (системного) часового пояса во время отображения (
Ниже приведен тестовый код 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());