IT이야기

Java 8 날짜-시간: ZonedDateTime에서 시작하기

cyworld 2021. 9. 13. 21:50
반응형

Java 8 날짜-시간: ZonedDateTime에서 시작하기


다음과 같은 차이점이 있습니까?

zonedDateTime.truncatedTo(ChronoUnit.DAYS);

zonedDateTime.toLocalDate().atStartOfDay(zonedDateTime.getZone());

서로를 선호하는 이유가 있습니까?

감사 해요


수정을 위해 업데이트됨:

대부분의 경우 동일합니다 . 겨울에서 여름 시간으로 전환할 때 브라질에 대한 다음 예를 참조하세요.

ZonedDateTime zdt = 
  ZonedDateTime.of(2015, 10, 18, 0, 30, 0, 0, 
    ZoneId.of("America/Sao_Paulo")); // switch to summer time
ZonedDateTime zdt1 = zdt.truncatedTo(ChronoUnit.DAYS);
ZonedDateTime zdt2 = zdt.toLocalDate().atStartOfDay(zdt.getZone());

System.out.println(zdt); // 2015-10-18T01:30-02:00[America/Sao_Paulo]
System.out.println(zdt1); // 2015-10-18T01:00-02:00[America/Sao_Paulo]
System.out.println(zdt2); // 2015-10-18T01:00-02:00[America/Sao_Paulo]

자르기는 로컬 타임라인에서 발생합니다. DAYS를 선택하면 자정을 선택합니다. 에 따르면 javadoc의truncate() -method 마침내 다시 새로 변환 ZonedDateTime간격 (1 시간)의 크기에 따라 시간 앞으로 이동한다.

zdt를 먼저 LocalDate(시간 부분 잘라내기) 로 변환한 다음 ZonedDateTime주어진 시간대에서 -part 를 찾는 것은 이 상황에서 사실상 동일합니다.

그러나 여름 시간에서 겨울 시간으로 다시 전환하는 반대의 경우에는 한 가지 예외가 있습니다 (반대 사례를 제공한 @Austin에게 대단히 감사합니다). 문제는 중첩 중에 사용할 오프셋을 결정할 때입니다. 일반적으로 클래스 ZonedDateTime는 이전 오프셋을 사용하도록 설계/지정되었습니다 . Javadoc 에서 발췌한 이 부분도 참조하세요 .

Overlaps의 경우 일반적인 전략은 로컬 날짜-시간이 Overlap의 중간에 있으면 이전 오프셋이 유지된다는 것입니다. 이전 오프셋이 없거나 이전 오프셋이 유효하지 않은 경우 일반적으로 "여름" 시간인 이전 오프셋이 사용됩니다.

ZonedDateTime결과적으로 클래스 가 자체 사양을 따를 경우 두 절차는 여전히 동일한 의미입니다.

zdt.truncatedTo(ChronoUnit.DAYS);

와 동일해야 합니다.

zdt.toLocalDate().atStartOfDay().atZone(zdt.getZone()).withEarlierOffsetAtOverlap();

그러나 @Austin의 예에 따른 실제 동작은 다음과 같습니다.

zdt.toLocalDate().atStartOfDay().atZone(zdt.getZone()).withLaterOffsetAtOverlap();

ZonedDateTime약간의 말투로 수업에 숨겨진 불일치처럼 보입니다 . 어떤 방법을 선호하는지 묻는다면 훨씬 더 길고 더 많은 키 입력이 필요하지만 두 번째 방법을 선호합니다. 그러나 그것이 하는 일에 대해 더 투명하다는 큰 장점이 있습니다. 두 번째 접근 방식을 선호하는 또 다른 이유는 다음과 같습니다.

실제로 현지 시간이 하루의 시작과 같은 첫 번째 순간을 얻습니다. 그렇지 않으면 첫 번째 방법을 사용할 때 다음을 작성해야 합니다.

zdt.truncatedTo(ChronoUnit.DAYS).withEarlierOffsetAtOverlap();

그들은 약간 다릅니다. javadocs에 따르면 truncatedTo()겹치는 경우 시간대를 유지하려고 시도하지만 atStartOfDay()자정이 처음 나타나는 시간을 찾습니다.

예를 들어, 쿠바는 오전 1시에 일광 절약 시간을 되돌리고 오전 12시로 되돌아갑니다. 해당 전환 이후 시간으로 시작하는 경우 atStartOfDay()는 오전 12시의 첫 번째 발생을 truncatedTo()반환하고 두 번째 발생을 반환합니다.

ZonedDateTime zdt = ZonedDateTime.of(2016, 11, 6, 2, 0, 0, 0, ZoneId.of("America/Havana"));
ZonedDateTime zdt1 = zdt.truncatedTo(ChronoUnit.DAYS);
ZonedDateTime zdt2 = zdt.toLocalDate().atStartOfDay(zdt.getZone());

System.out.println(zdt);  // 2016-11-06T02:00-05:00[America/Havana]
System.out.println(zdt1); // 2016-11-06T00:00-05:00[America/Havana]
System.out.println(zdt2); // 2016-11-06T00:00-04:00[America/Havana]

다른 방법도 있습니다.

zonedDateTime.with(LocalTime.MIN);

truncatedTo와 동일한 결과를 생성합니다.

ReferenceURL : https://stackoverflow.com/questions/29143910/java-8-date-time-get-start-of-day-from-zoneddatetime

반응형