2017-01-30 3 views
2

나는 주어진 두 시간의 차이를 안드로이드 앱에서 계산하려고합니다. 이 작업을 수행하기 위해 JodaTime과 Period 클래스를 Period의 getYears(), getDays(), getHours(), getMinutes() 및 getSeconds() 메서드와 함께 사용했습니다. 그러나 나는 그것이 날짜의 각 요소 사이의 절대적인 차이라고 생각하는 것을주는 것을 깨달았다. 예를 들어, 날짜에 내 함수를 호출 2017-01-29 00:00:00 (yyyy-MM-dd HH:mm:ss)2018-01-28 00:00:00는 반환합니다JodaTime 기간이 예상치 못한 결과를 반환합니다.

0 years 
2 days 
0 hours 
0 minutes 
0 seconds 

는 다른 모든 부분에서 제로와 함께 364 days을 반환해야 할 때. 물론, 그것은 안드로이드 애플 리케이션이므로 나는 그들을 인쇄하지 오전, 나는 별도로 디스플레이를 처리하고 있습니다. LocalDateTime과 Duration.between를 사용하여 컴퓨터에서이 작업을 수행 할 수 있었지만 여기에서이 클래스를 사용할 수는 없습니다. 내 현재 방법에 대한 수정 사항 (아래에 있음) 또는 완전히 새로운 접근 방법에 대한 제안을 찾고 있습니다. 미리 감사드립니다. 현재 기능 :

public int[] getDifference(DateTime start, DateTime end){ 
    Period p = new Period(start, end); 
    int[] differences = new int[5]; 
    differences[0] = p.getYears(); 
    differences[1] = p.getDays(); 
    differences[2] = p.getHours(); 
    differences[3] = p.getMinutes(); 
    differences[4] = p.getSeconds(); 
    return differences; 
} 
+0

기간은 원하는대로 - 왜 사용할 수 없습니까? – GreyBeardedGeek

답변

0

왜 364 일이 걸릴까요? class doc for Period을 읽으십시오.

이 기간의 일 필드 부분을 가져옵니다()

공공 INT getDays.

여기에는 "필드 부분"이 있습니다. Period은 년, 월, 주, 일,시, 분, 초 및 밀리 초의 숫자입니다. 예를 들어, 년 반은 두 부분 년 1 부분 6

귀하의 출력의 부분은 개월 부분에 생략 개월과 부분이있을 것입니다.

DateTime start = new DateTime (2017 , 1 , 29 , 0 , 0 , DateTimeZone.UTC); 
DateTime stop = new DateTime (2018 , 1 , 28 , 0 , 0 , DateTimeZone.UTC); 
Period p = new Period (start , stop); 
int[] differences = new int[ 7 ]; 
differences[ 0 ] = p.getYears(); 
differences[ 1 ] = p.getMonths(); 
differences[ 2 ] = p.getWeeks(); 
differences[ 3 ] = p.getDays(); 
differences[ 4 ] = p.getHours(); 
differences[ 5 ] = p.getMinutes(); 
differences[ 6 ] = p.getSeconds(); 
System.out.println ("differences: " + Arrays.toString (differences)); 

실행하면 11 개월, 4 주 및 2 일이 표시됩니다. MacOS El Capitan의 Java 8 Update 121에서 Joda-Time 2.8.2 실행.

차이는 [0, 11, 4, 2, 0, 0, 0]

당신은 toStandardDays를 호출 생각할 수 있습니다. 하지만 그렇게하면 예외적으로 (java.lang.UnsupportedOperationException) 다음과 같이 말합니다. "이 기간에는 월과 월이 포함되어 있으므로 일로 변환 할 수 없습니다."

java.time

는 참고 : 지금 maintenance modeJoda-Time 프로젝트는의 java.time 클래스로 마이그레이션을 조언한다.

java.time에서 시간 표시 막대에 연결되지 않은 시간 간격은 java.time.Period 또는 java.time.Duration의 시간 - 분 - 초 - 나노초로 표시됩니다.

LocalDate 클래스는 time-of-day 및 시간대가없는 날짜 전용 값을 나타냅니다.

java.time 클래스는 팩토리 메소드를 대신 사용하여 생성자를 사용하지 않습니다.toString

LocalDate start = LocalDate.of (2017 , 1 , 29); 
LocalDate stop = LocalDate.of (2018 , 1 , 28); 
Period period = Period.between (start , stop); 
System.out.println ("period.toString(): " + period); 

standard ISO 8601 format for durations은 텍스트의 일부를 생성한다. 우리는 여기서 11 개월 30 일을 봅니다. 분명히 Joda-Time과 java.time은 다르게 계산됩니다. 여기서 우리는 다른 결과를 봅니다. Joda-Time은 java.time이 실행되지 않는 주를 계산합니다.

period.toString() : P11M30D

만, 또한 자바 독을 참조 년, 일, 시간, 분, 초에 특정 정상화를 원하기 때문에 당신은 또한 해당 기간 유형을 설정해야합니다
0

.

LocalDateTime start = new LocalDateTime(2017, 1, 29, 0, 0); 
LocalDateTime end = new LocalDateTime(2018, 1, 28, 0, 0); 
Period p = new Period(start, end, PeriodType.yearDayTime().withMillisRemoved()); 
System.out.println(p); // P364D (what you expected) 

이 예제는 시작과 끝의 형태 DateTime와 함께 작동합니다.

후자의 API가 날짜 및 시간 구성 요소가있는 기간을 처리 할 수 ​​없기 때문에이 코드 예제 (Joda-Time 클래스의 Period)는 Java-8에 포함 된 새로운 java.time -API로 완전히 마이그레이션 할 수 없습니다. 또한주기 유형을 지정할 수 없으므로 PeriodType처럼 정규화를 제어 할 수 없습니다.

관련 문제