두 Joda-Time DateTime
인스턴스의 일 차이를 어떻게 알 수 있습니까? ‘일의 차이’를 사용하면 시작이 월요일이고 종료가 화요일이면 시작 및 종료 날짜의 시간 / 분 / 초에 관계없이 반환 값 1을 기대합니다.
Days.daysBetween(start, end).getDays()
시작이 저녁에 있고 아침에 끝나는 경우 0을 제공합니다.
나는 다른 날짜 필드와 같은 문제를 겪고 있기 때문에 덜 중요한 필드를 ‘무시’하는 일반적인 방법이 있기를 바랐습니다.
다시 말해, 2 월과 3 월 4 일 사이의 월도 1 일 것이고 14:45와 15:12 사이의 시간도 마찬가지입니다. 그러나 14:01과 14:55의 시간 차이는 0입니다.
답변
짜증나게, withTimeAtStartOfDay 답변은 틀리지 만 가끔 만 있습니다. 당신이 원하는 :
Days.daysBetween(start.toLocalDate(), end.toLocalDate()).getDays()
“자정 / 일 시작”은 때때로 오전 1시 (일부 지역에서는 일광 절약 시간제)를 의미하며 Days.daysBetween이 제대로 처리되지 않는 것으로 나타났습니다.
// 5am on the 20th to 1pm on the 21st, October 2013, Brazil
DateTimeZone BRAZIL = DateTimeZone.forID("America/Sao_Paulo");
DateTime start = new DateTime(2013, 10, 20, 5, 0, 0, BRAZIL);
DateTime end = new DateTime(2013, 10, 21, 13, 0, 0, BRAZIL);
System.out.println(daysBetween(start.withTimeAtStartOfDay(),
end.withTimeAtStartOfDay()).getDays());
// prints 0
System.out.println(daysBetween(start.toLocalDate(),
end.toLocalDate()).getDays());
// prints 1
LocalDate
전체 단계를 회피하는 것입니다.
답변
Days
수업
메소드 Days
와 함께 클래스를 사용하면 withTimeAtStartOfDay
작동합니다.
Days.daysBetween(start.withTimeAtStartOfDay() , end.withTimeAtStartOfDay() ).getDays()
답변
답변
tl; dr
java.time.temporal.ChronoUnit.DAYS.between(
earlier.toLocalDate(),
later.toLocalDate()
)
…또는…
java.time.temporal.ChronoUnit.HOURS.between(
earlier.truncatedTo( ChronoUnit.HOURS ) ,
later.truncatedTo( ChronoUnit.HOURS )
)
java.time
참고로 Joda-Time 프로젝트는 이제 유지 관리 모드 에 있으며 팀은 java.time 클래스 로의 마이그레이션을 조언합니다 .
Joda 타임의 상당 DateTime
하다 ZonedDateTime
.
ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime now = ZonedDateTime.now( z ) ;
분명히 날짜로 날짜를 계산하려고합니다. 즉, 시간을 무시하고 싶습니다. 예를 들어 자정 전 1 분을 시작하고 자정 후 1 분을 끝내면 하루가됩니다. 이 동작을하려면에서을 추출 LocalDate
하십시오 ZonedDateTime
. 이 LocalDate
클래스는 시간이없고 시간대가없는 날짜 전용 값을 나타냅니다.
LocalDate localDateStart = zdtStart.toLocalDate() ;
LocalDate localDateStop = zdtStop.toLocalDate() ;
ChronoUnit
열거 형을 사용하여 경과 일수 또는 다른 단위를 계산 하십시오 .
long days = ChronoUnit.DAYS.between( localDateStart , localDateStop ) ;
자르기
60 분의 시간 범위로서 완전한 시간이 아니라 시간의 시간에 따른 시간의 델타에 관심이있는 경우이 계산을 수행하는보다 일반적인 방법에 대해 문의하려면이 truncatedTo
방법을 사용하십시오 .
다음은 같은 날 14:45 ~ 15:12의 예입니다.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime start = ZonedDateTime.of( 2017 , 1 , 17 , 14 , 45 , 0 , 0 , z );
ZonedDateTime stop = ZonedDateTime.of( 2017 , 1 , 17 , 15 , 12 , 0 , 0 , z );
long hours = ChronoUnit.HOURS.between( start.truncatedTo( ChronoUnit.HOURS ) , stop.truncatedTo( ChronoUnit.HOURS ) );
1
며칠 동안 작동하지 않습니다. 이 경우 toLocalDate ()를 사용하십시오.
java.time에 대하여
java.time의 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 까다로운 기존에 대신 기존 과 같은 날짜 – 시간의 수업을 java.util.Date
, Calendar
, SimpleDateFormat
.
Joda 타임 프로젝트는 지금에 유지 관리 모드 의로 마이그레이션을 조언 java.time의 클래스.
자세한 내용은 Oracle Tutorial을 참조하십시오 . 많은 예제와 설명을 보려면 스택 오버플로를 검색하십시오. 사양은 JSR 310 입니다.
java.time 객체를 데이터베이스와 직접 교환 할 수 있습니다 . JDBC 4.2 이상을 준수 하는 JDBC 드라이버를 사용하십시오 . 문자열이 필요없고 수업이 필요 없습니다 .java.sql.*
java.time 클래스는 어디서 구할 수 있습니까?
- 자바 SE 8 , 자바 SE 9 , 자바 SE (10) , 그리고 나중에
- 내장.
- 번들로 구현 된 표준 Java API의 일부입니다.
- Java 9에는 몇 가지 사소한 기능과 수정 사항이 추가되었습니다.
- Java SE 6 및 Java SE 7
- 대부분의 java.time 기능은 ThreeTen-Backport의 Java 6 & 7로 백 포트됩니다 .
- 기계적 인조 인간
- java.time 클래스의 최신 버전의 Android 번들 구현.
- 이전 Android (<26)의 경우 ThreeTenABP 프로젝트 는 위에서 언급 한 ThreeTen-Backport를 채택합니다 . ThreeTenABP 사용 방법…을 참조하십시오 .
ThreeTen – 추가 프로젝트 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 입증 된 근거입니다. 당신은 여기에 몇 가지 유용한 클래스와 같은 찾을 수 있습니다 Interval
, YearWeek
, YearQuarter
, 그리고 더 .
ThreeTen – 추가 프로젝트 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 입증 된 근거입니다. 당신은 여기에 몇 가지 유용한 클래스와 같은 찾을 수 있습니다 Interval
, YearWeek
, YearQuarter
, 그리고 더 .
답변
허용 된 답변은 두 개의 LocalDate
객체를 작성하며 많은 데이터를 읽는 경우 상당히 비쌉니다. 나는 이것을 사용한다 :
public static int getDaysBetween(DateTime earlier, DateTime later)
{
return (int) TimeUnit.MILLISECONDS.toDays(later.getMillis()- earlier.getMillis());
}
호출 getMillis()
하면 이미 존재하는 변수를 사용합니다.
MILLISECONDS.toDays()
그런 다음 간단한 산술 계산을 사용하고 객체를 만들지 않습니다.
답변
java.time.Period
java.time.Period
수업을 사용하여 일 을 계산 하십시오 .
Java 8을 사용하면 차이를 계산하는 것이 더 직관적 LocalDate
이므로 LocalDateTime
두 날짜를 나타냅니다.
LocalDate now = LocalDate.now();
LocalDate inputDate = LocalDate.of(2018, 11, 28);
Period period = Period.between( inputDate, now);
int diff = period.getDays();
System.out.println("diff = " + diff);
답변
DateTime dt = new DateTime(laterDate);
DateTime newDate = dt.minus( new DateTime ( previousDate ).getMillis());
System.out.println("No of days : " + newDate.getDayOfYear() - 1 );