2016-10-18 3 views
1

Joda-Time에 연도를 반올림하는 기존 방법이 있습니까?Joda-Time에서 연도를 반올림하는 방법

여러분이 DateTime startDate = 10-18-2016 및 DateTime endDate = 12-18-2017이라고 가정 해보십시오. 나는 2 년까지 반올림하기를 원합니다.

현재 내가 할 때

Years yearsBetween = Years.yearsBetween(startDate, endDate); 

나는 yearsBetween = 1. Joda 시간을 사용하여이 문제를 해결하는 간단한 방법이 있나요 얻거나 내가이 처리하는 사용자 정의 메소드를 작성해야합니까?

+1

endDate에 1 년 빼기를 추가 할 수 있습니다. –

+1

간단한 계산 만 사용하면 어떨까요? \t \t'int years = (int) Math.ceil ((double) Days.daysBetween (startDate, endDate) .getDays()/365);' – asdf

답변

2

TL; DR

  • 는에 먼저 해의 시작 날짜를 이동합니다.
  • 의 첫 번째 날짜로 끝나는 날짜를 년 뒤에 이동하십시오.

반 공개

Joda 타임이 시작은 포함 인 시간의 스팬에 반 열림 방식을 사용하고 결말이 독점입니다. 따라서 1 년은 해당 연도의 1 월 1 일부터 시작하여 다음 해 1 월 1 일까지 실행되지만 포함되지 않습니다.

2016-2017의 날짜를 2 년으로 지정하려면 시작일을 연초 첫날로 이동하고 의 첫 해로 끝내는 날짜를 연도 다음으로 이동하십시오.

LocalDate으로 변환합니다. 우리는이 계산을 위해 시간을 신경 쓰지 않기 때문에.

LocalDate start = startDate.toLocalDate().withDayOfMonth(1).withMonthOfYear(1); // Move to first of same year. 
LocalDate stop = endDate.toLocalDate().withDayOfMonth(1).withMonthOfYear(1).plusYears(1); // Move to first of *following* year. 

그런 다음 Years과 같은 계산을 수행하십시오. 2016의 모든 날짜 2에서

Years yearsBetween = Years.yearsBetween(start , stop); // Half-Open, beginning is inclusive while ending is exclusive. 
int years = yearsBetween.getYears(); // Plain integer. 

결과 (2018년 1월 1일로 이동) 및 2017 (2016년 1월 1일로 이동).


java.time

참고는 Joda-Time 프로젝트는 java.time 클래스로 마이그레이션을 조언 팀과 함께, maintenance mode에 지금이다.

이 작품은 java.time에서 조금 더 간단합니다. TemporalAdjuster 인터페이스는 클래스가 날짜 - 시간 값을 조작하도록 제공합니다. TemporalAdjusters 클래스 (복수참고)는 몇 가지 구현을 제공합니다. 이것들은 올해의 첫 번째와 내년의 첫 번째를 얻는 것을 제공합니다.

여기에 Zdt으로, 나는 당신이 가진 ZonedDateTime 개체를 참조합니다. 이 클래스는 해상도가 나노초 인 특정 시간대 (ZoneId)의 타임 라인에서 한 순간을 나타냅니다. ZonedDateTime 개체에서 LocalDate으로 변환 한 다음 TemporalAdjuster 개체 쌍을 적용하여 첫 해와 다음 해로 이동합니다.

LocalDate start = yourStartingZdt.toLocalDate().with(TemporalAdjusters.firstDayOfYear()); 
LocalDate stop = yourEndingZdt.toLocalDate().with(TemporalAdjusters.firstDayOfNextYear()); 

java.time 클래스는 Joda 타임 Years 클래스의 해당 포함되지 않습니다. 원하는 경우 클래스를 포함하는 추가 클래스로 java.time을 확장하기 위해 ThreeTen-Extra 프로젝트를 앱에 추가 할 수 있습니다.

또는 Period 클래스를 통해 연도 수를 구할 수 있습니다.

Joda-Time과 마찬가지로 Period을 포함한 java.time 클래스는 Half-Open 방식을 사용하여 시간을 측정합니다. Half-Open을 사용하면 모든 날짜 - 시간 작업에서 일관되게 사용하는 것이 좋습니다. 코드가 모두 단순하고 오류가 발생하기 쉽습니다. 2016의 모든 날짜 2에서

Period p = Period.between(start , stop); 
int years = p.getYears(); 

결과 (2018년 1월 1일로 이동) 및 2017 (2016년 1월 1일로 이동).

java.time 프레임 워크 나중에 자바 8에 내장되어 java.time 소개

. 이 클래스는 java.util.Date, .Calendar, & java.text.SimpleDateFormat과 같이 문제가있는 이전 legacy 날짜 - 시간 클래스를 대체합니다.

Joda-Time 프로젝트는 지금 maintenance mode에, java.time로 마이그레이션을 조언한다.

자세히 알아 보려면 Oracle Tutorial을 참조하십시오. 그리고 많은 예제와 설명을 위해 스택 오버플로를 검색하십시오. 사양은 JSR 310입니다.

어디에서 java.time 클래스를 얻을 수 있습니까?

  • Java SE 8SE 9 이후
    • 내장한다.
    • 번들로 구현 된 표준 Java API의 일부입니다.
    • Java 9에는 몇 가지 사소한 기능과 수정 사항이 추가되었습니다.
  • Java SE 6 및 java.time 기능의 대부분
  • Android
    • ThreeTenABP 프로젝트 적응 ThreeTen - 백 포트 구체적 안드로이드 (상술 한).
    • How to use…을 참조하십시오.

ThreeTen-Extra 프로젝트는 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 가능성을 입증합니다.여기에 Interval, YearWeek, YearQuartermore과 같은 유용한 클래스가 있습니다.

관련 문제