Что вам нужно, это 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