2017-04-21 32 views
2

LocalDate를 사용하면 기간 인스턴스에서 차이가 나타납니다.기간의 두 ZonedDateTime 차이점

LocalDate born = LocalDate.of(1990, Month.SEPTEMBER, 30); 
Period myAge = Period.between(born, LocalDate.now()); 
System.out.println("My age is: "+myAge.getYears()+" years "+myAge.getMonths()+" months "+myAge.getDays()+" days."); 

출력 :

내 나이가 26 년 6개월 이십삼일

그래서

, 내가 년, 월과 일의 나이를 얻기 위해 시간을 사용했다 예를 들어, .

두 표준 시간대 (미국/태평양 및 호주/멜버른)를 사용하여 ZoneDateTime과 동일한 작업을 수행하고 싶습니다. 예를 들면 다음과 같습니다.

ZonedDateTime now = ZonedDateTime.now(); // US/Pacific 

LocalDate date = LocalDate.of(1990, Month.SEPTEMBER, 30); 
LocalTime time = LocalTime.of(23, 55); 
ZoneId zone = ZoneId.of("Australia/Melbourne"); 
ZonedDateTime born = ZonedDateTime.of(date, time, zone); 

LocalDate와 동일한 출력을 얻고 싶습니다. 어떻게해야합니까? 그것은 의미가 있습니까?

예상 출력 :

내 나이는 : 이십육년 6개월 이십사일

+2

문제는 몇 시간 내로 반올림하고 어떤 시간대를 계산해야 할지를 결정해야합니다. 다른 DST 규칙으로 인해 두 영역의 수가 일치하지 않을 수 있습니다. –

답변

1

는 ISO-8601 형식으로 시간의 날짜를 기반으로 양이다 Period 문서 상태의 첫 번째 행 . XXXTime에 사용하기위한 것이 아닙니다.

그러나 ZonedDateTime 제공하면 다른 Temporal (귀하의 경우 now)까지 주어진 ChronoUnit의 수를 반환 것이다 until 방법. 예를 들어

:

:

born.until(now, ChronoUnit.YEARS); 

가 26

한 트릭을 반환은 시작 날짜로 검색 한 차이를 추가 한 다음 예를 들어 다음 ChronoUnit

를 처리하는 것입니다

long years = born.until(now, ChronoUnit.YEARS); 
born = born.plusYears(years); 

long months = born.until(now, ChronoUnit.MONTHS); 
born = born.plusMonths(months); 

long days = born.until(now, ChronoUnit.DAYS); 

그런 다음 변수를 인쇄 할 수 있습니다. 에스.

+0

@JodaStephen 이것이 바로 검사 직후 태어난 변수를 plusYears 및 plusMonth로 재 지정하는 이유입니다. –

3

생년월일에 ZonedDateTime을 사용하는 대신 LocalDateZoneId (즉, 별도의 입력란/열)을 저장하는 것이 좋습니다.

두 개의 인스턴스에서 Period을 얻는 간단한 대답은 toLocalDate() 모두를 호출하는 것입니다. 여러분이 알게 되듯이, ZonedDateTime 인스턴스가 다른 표준 시간대에있을 수도 있으므로 정상화 작업이 필요할 수 있습니다. 그러나이 데이터의 더 나은 저장 용량은 LocalDateZoneId의 두 필드라는 점을 다시 강조합니다.당신이 (남은 초)을 Period 두 플러스 Duration의 차이를해야하는 경우

Period p = Period.between(born.toLocalDate(), now.toLocalDate()); 
// warning! the above ignores time-zones, assuming both are the same 

, 당신은이를 사용할 수 있습니다

Period p = Period.between(born.toLocalDate(), now.toLocalDate()); 
Duration d = Duration.between(born.with(now.toLocalDate()), now); 

마지막 옵션은 ThreeTen-Extra을 사용하는 것입니다. 곧 릴리스 될 v1.1에는 PeriodDuration을 결합한 클래스 PeriodDuration이 포함되며 두 개의 LocalDateTime 인스턴스 사이의 시간 간격을 저장할 수 있습니다. 모든 사람들이 자신의 생일 같은 방법으로 관찰, 또는 다른 방법을 넣어 때문에 생일을 대표하는 LocalDate를 사용해야합니다

0

이유는, 모두가 자신의 생일들이 현재에있는 위치에 따라 시계를 사용하여 관찰한다. 프랑스에서 태어 났으며 현재 시간대 오프셋이 다른 미국에 살고있는 경우 프랑스의 현재 날짜를 관찰하여 생일을 축하하지 않을 경우 현재 거주하고있는 날짜를 확인하십시오 (). 너에게. 시간대 지원이있는 시간 클래스는 지역을 스팬하는 이벤트 (예 : 항공편 도착 및 출발 추적 소프트웨어)에 사용해야합니다. 따라서 생일을 설명하기 위해 ZonedDateTime을 사용하는 것은 잘못이 아닙니다. 이는 의미 상 올바르지 않습니다.

또한 Period은 분명히 시간 범위를 나타내는 TemporalAmount을 구현합니다. 생일을 표현하기 위해 그것을 사용하면 (다시) 잘못되지는 않지만 의도가 명확하지 않습니다. 생일은 기간이 아닌 정확한 시간입니다. 따라서 전체적으로 LocalDate이 최선의 선택입니다.