Как изменить часовой пояс в ZonedDateTime для Java - PullRequest
0 голосов
/ 02 мая 2018

Что я имею в виду это. Предположим, у меня есть объект даты, который 1 мая 2018 года, 12:00 утра. Я хотел бы создать объект ZonedDateTime, который является 1 мая 2018 года, 12:00 утра, но ДРУГОГО часового пояса (скажем, EST). Потому что, если я передаю этот объект даты в ZonedDateTime, он обрабатывает этот объект даты как UTC (поэтому он обрабатывает его как 1 мая 2018 года, 12:00 по Гринвичу), и я хочу, чтобы он сохранил значения этого поля даты, но изменил тимзеон по восточному поясному времени (1 мая 2018 года, 12:00 по восточному поясному времени). Есть ли способ сделать это в Java?

1 Ответ

0 голосов
/ 03 мая 2018

Что вам нужно, это LocalDate:

    LocalDate date = LocalDate.of(2018, Month.MAY, 1);

Это будет понято во всех часовых поясах и никогда не будет ничем иным, кроме 1 мая. «Местный» в этом и других именах классов в java.time означает «без часового пояса».

Если вы настаиваете на ZonedDateTime, ответ будет withZoneSameLocal:

    ZonedDateTime zdt = date.atStartOfDay(ZoneOffset.UTC);
    ZonedDateTime inEst = zdt.withZoneSameLocal(ZoneId.of("Australia/Brisbane"));
    System.out.println(inEst);

Выход:

2018-05-01T00: 00 + 10: 00 [Австралия / Брисбен]

Не полагайтесь на EST или другие трех- и четырехбуквенные сокращения часового пояса. Например, EST неоднозначен (используется как в Северной Америке, так и в Австралии) и не является часовым поясом (используется менее половины года). Вместо этого укажите регион / город, например, Америка / Атикокан.

Если под «объектом даты» вы подразумевали объект устаревшего класса java.util.Date (избегайте их, если можете, предпочитайте современные классы в java.time):

    Date oldfashionedDate = // …;

    OffsetDateTime dateTime = oldfashionedDate.toInstant().atOffset(ZoneOffset.UTC);
    if (! dateTime.toLocalTime().equals(LocalTime.MIDNIGHT)) {
        throw new IllegalStateException("java.util.Date was supposed to be at midnight in UTC but was " + dateTime);
    }
    LocalDate date = dateTime.toLocalDate();
    System.out.println(date);

Выход:

2018-05-01

...