tl; dr
사용하지 않는 java.util.Date
개체를 대체물로 변환하십시오 java.time.Instant
. 그런 다음 경과 시간을로 계산하십시오 Duration
.
Duration d =
Duration.between( // Calculate the span of time between two moments as a number of hours, minutes, and seconds.
myJavaUtilDate.toInstant() , // Convert legacy class to modern class by calling new method added to the old class.
Instant.now() // Capture the current moment in UTC. About two and a half hours later in this example.
)
;
d.toString () : PT2H34M56S
d.toMinutes () : 154
d.toMinutesPart () : 34
ISO 8601 형식 : PnYnMnDTnHnMnS
합리적인 표준 ISO 8601 은 시간 범위의 간결한 텍스트 표현을 몇 년, 월, 일, 시간 등으로 정의합니다. 표준은 그러한 기간을 기간 이라고 부릅니다 . 형식은 PnYnMnDTnHnMnS
를 Where P
수단 "기간"은이 T
시간 부분의 일 부분을 분리하고, 다음에 문자 숫자 사이.
예 :
P3Y6M4DT12H30M5S
3 년, 6 개월, 4 일, 12 시간, 30 분 및 5 초
PT4H30M
4 시간 반
java.time
Java 8 이상에 내장 된 java.time 프레임 워크는 번거로운 이전 java.util.Date
/ java.util.Calendar
클래스를 대체합니다 . 새로운 클래스는 개념적으로 유사하지만 재구성 된 후계자로 의도 된 매우 성공적인 Joda-Time 프레임 워크에서 영감을 얻었습니다 . JSR 310에 의해 정의됩니다 . ThreeTen-Extra 프로젝트로 확장되었습니다 . 학습서를 참조하십시오 .
순간
이 Instant
클래스는 나노초 의 해상도 (소수점의 최대 9 자리)로 UTC 의 타임 라인에서 순간을 나타냅니다 .
Instant instant = Instant.now() ; // Capture current moment in UTC.
Date
/ 와 같은 레거시 클래스를 피하는 것이 가장 Calendar
좋습니다. 그러나 아직 java.time으로 업데이트되지 않은 이전 코드와 상호 운용해야하는 경우 앞뒤로 변환하십시오. 이전 클래스에 추가 된 새 변환 메소드를 호출하십시오. 에서로 이동 java.util.Date
하려면을 (를 Instant
) 호출하십시오 Date::toInstant
.
Instant instant = myJavaUtilDate.toInstant() ; // Convert from legacy `java.util.Date` class to modern `java.time.Instant` class.
시간의 경간
java.time 클래스는 시간 범위를 몇 년, 월, 일, 시간, 분, 초로 나타내는이 아이디어를 두 개의 반으로 나눕니다.
다음은 예입니다.
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now ( zoneId );
ZonedDateTime future = now.plusMinutes ( 63 );
Duration duration = Duration.between ( now , future );
콘솔로 덤프하십시오.
모두 Period
와 Duration
사용 ISO 8601 의 가치의 String 표현을 생성하기위한 표준.
System.out.println ( "now: " + now + " to future: " + now + " = " + duration );
지금 : 2015-11-26T00 : 46 : 48.016-05 : 00 [미국 / 몬트리올]에서 미래로 : 2015-11-26T00 : 46 : 48.016-05 : 00 [미국 / 몬트리올] = PT1H3M
Java 9는 Duration
일 부분, 시간 부분, 분 부분 및 초 부분을 가져 오는 메소드를 추가합니다 .
전체 지속 시간에서 총 일 수, 시간 또는 분 또는 초 또는 밀리 초 또는 나노초를 얻을 수 있습니다.
long totalHours = duration.toHours();
Java 9에서 Duration
클래스는 일,시, 분, 초, 밀리 초 / 나노초의 다양한 부분을 반환 하기 위한 새로운 메소드 를 얻습니다 . , 등 의 to…Part
메소드를 호출하십시오 .toDaysPart()
toHoursPart()
ChronoUnit
"일수"와 같이 더 간단한 시간 단위 만 신경 쓰는 경우 ChronoUnit
열거 형을 사용하십시오 .
long daysElapsed = ChronoUnit.DAYS.between( earlier , later );
또 다른 예.
Instant now = Instant.now();
Instant later = now.plus( Duration.ofHours( 2 ) );
…
long minutesElapsed = ChronoUnit.MINUTES.between( now , later );
120
java.time에 대하여
java.time의 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 까다로운 기존에 대신 기존 과 같은 날짜 - 시간의 수업을 java.util.Date
, Calendar
, SimpleDateFormat
.
Joda 타임 프로젝트는 현재의 유지 관리 모드 , java.time로 마이그레이션을 조언한다.
자세한 내용은 Oracle Tutorial을 참조하십시오 . 많은 예제와 설명을 보려면 스택 오버플로를 검색하십시오. 사양은 JSR 310 입니다.
java.time 클래스는 어디서 구할 수 있습니까?
ThreeTen - 추가 프로젝트 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 입증 된 근거입니다. 당신은 여기에 몇 가지 유용한 클래스와 같은 찾을 수 있습니다 Interval
, YearWeek
, YearQuarter
, 그리고 더 .
조다 타임
업데이트 : Joda-Time 프로젝트는 이제 유지 관리 모드 에 있으며 팀은 java.time 으로의 마이그레이션을 조언합니다. 클래스 . 나는 역사를 위해이 섹션을 그대로 둡니다.
Joda-Time 라이브러리는 기본값으로 ISO 8601을 사용합니다. 이 Period
클래스는 이러한 PnYnMnDTnHnMnS 문자열을 구문 분석하고 생성합니다.
DateTime now = DateTime.now(); // Caveat: Ignoring the important issue of time zones.
Period period = new Period( now, now.plusHours( 4 ).plusMinutes( 30));
System.out.println( "period: " + period );
렌더 :
period: PT4H30M