Java 8 Date Time API (java.time)와 Joda-Time의 차이점


264

java.util.Date 및 Joda-Time과 관련된 질문이 있음을 알고 있습니다 . 그러나 약간의 파기 후에 java.time API ( JSR 310에 의해 정의 된 Java 8의 새로운 기능 )와 Joda-Time 의 차이점에 대한 스레드를 찾을 수 없었습니다 .

Java 8의 java.time API가 훨씬 깨끗하고 Joda-Time보다 훨씬 더 많은 것을 할 수 있다고 들었습니다. 그러나 두 가지를 비교하는 예를 찾을 수 없습니다.

  • Joda-Time이 할 수없는 java.time은 무엇을 할 수 있습니까?
  • java.time이 Joda-Time보다 나은 점은 무엇입니까?
  • java.time으로 성능이 향상됩니까?

8
그것은 Java 8이 아닌 Java 7에 관한 것이 아닙니다.이 질문에 대한 답변은 Java 8에 대해 매우 자세하게 편집되었습니다. 내 질문은 특히 Java 7의 java.util.Date가 아닌 Java 8의 새로운 DateTime API에 대해 묻는 것입니다. Java 8과 JodaTime을 비교하는 답변을 찾고 있습니다.

2
아마도 이 오라클 문서는 당신을 도울 수 있습니다.
MarioDS

Java 7이있는 경우 추가 라이브러리를 사용하고 Java 8이있는 경우 내장 라이브러리를 사용하십시오. 두 라이브러리는 기본적으로 같은 사람에 의해 설계되었으므로 어떤 큰 차이점이 있을지 잘 모르겠습니다.
Peter Lawrey

2
@ PeterLawrey : Joda-Time과 Java 8 날짜 및 시간 API는 실제로 상당히 다릅니다.
jarnbjo

5
프로젝트는 Stephen Colbourne (이 두 프로젝트의 기본 저자)에서 읽을 수 있습니다 .
Matt Johnson-Pint

답변:


416

일반적인 특징

a) 두 라이브러리 모두 불변 유형을 사용합니다. Joda-Time은와 같은 추가 가변 유형도 제공합니다 MutableDateTime.

b) 또한 두 라이브러리는 Eric Evans 의 디자인 연구 "TimeAndMoney" 또는 도메인 기반 스타일에 대한 Martin Fowler의 아이디어에서 영감을 얻었 으므로 유창한 프로그래밍 스타일을 위해 다소 노력합니다 (항상 완벽한 것은 아니지만 ;-)).

c) 두 라이브러리 모두 실제 달력 날짜 유형 ( LocalDate), 실제 벽 시간 유형 ( LocalTime) 및 구성 () 을 얻습니다 LocalDateTime. 그것은 old java.util.Calendar와 비교할 때 매우 큰 승리 java.util.Date입니다.

d) 두 라이브러리 모두 메소드 중심 접근 방식을 사용하므로 사용자가 getDayOfYear()대신 사용하도록 권장합니다 get(DAY_OF_YEAR). 이것은 java.util.Calendarint를 과도하게 사용하여 형식이 안전하지는 않지만 비교할 때 많은 추가 방법을 유발합니다 .

공연

점 3 (예외 잡기)이 더 이상 사용되지 않을 수도 있지만 Mikhail Vorontsov의 분석을 가리키는 @ OO7의 다른 대답을 참조하십시오 ( 이 JDK- 버그 참조) . 다른 성능 ( JSR-310 에 일반적으로 유리함 )은 주로 Joda-Time 의 내부 구현이 항상 기계 시간과 같은 긴 기본 (밀리 초)을 사용 한다는 사실에 기인합니다 .

없는

Joda-Time은 종종 시스템 시간대, 기본 로캘, 현재 타임 스탬프 등에 대해 기본값으로 NULL을 사용하지만 JSR-310은 거의 항상 NULL 값을 거부합니다.

정도

JSR-310은 나노초 정밀도를 처리 하는 반면 Joda-Time은 밀리 초 정밀도 로 제한됩니다 .

지원되는 필드 :

Java-8 (JSR-310)에서 지원되는 필드에 대한 개요는 temporal-package의 일부 클래스 (예 : ChronoFieldWeekFields )에 의해 제공되며 Joda-Time은이 영역에서 다소 약합니다 ( DateTimeFieldType 참조) . Joda-Time의 가장 큰 부족은 현지화 된 주 관련 필드가 없다는 것입니다. 두 필드 구현 디자인의 공통적 인 특징은 둘 다 long 유형의 값을 기반으로한다는 것입니다 (다른 유형은없고 열거 형도 포함하지 않음).

열거 형

JSR-310 이벤트의 열거가 좋아 DayOfWeek하거나 MonthJoda 타임이 제공하지 않는 동안은 주로 년 전에 ● 2002 년에서 2004 년 개발 되었기 때문에 자바 5 .

영역 API

a) JSR-310은 Joda-Time보다 더 많은 시간대 기능을 제공합니다. 후자는 표준 시간대 오프셋 전환 이력에 프로그래밍 방식으로 액세스 할 수 없지만 JSR-310은이를 수행 할 수 있습니다.

b) 정보 : JSR-310은 내부 시간대 저장소를 새로운 위치와 다른 형식으로 옮겼습니다. 이전 라이브러리 폴더 lib / zi가 더 이상 존재하지 않습니다.

조절기 대 속성

JSR-310은 TemporalAdjuster임시 계산 및 조작을 외부화하는 공식화 된 방법으로-인터페이스를 도입했습니다 . 특히 라이브러리 또는 프레임 워크 작성자의 경우 이는 JSR-310의 새로운 확장 (정적 도우미에 해당하는)을 포함하는 훌륭하고 상대적으로 쉬운 방법입니다. 전자의 수업 java.util.Date).

그러나 대부분의 사용자에게는 코드 작성 부담이 여전히 사용자에게 있기 때문에이 기능의 가치는 매우 제한적입니다. 새로운 개념에 기반한 내장 솔루션 TemporalAdjuster은 그다지 많지 않으며 현재 TemporalAdjusters제한된 조작 세트 (및 열거 형 Month또는 기타 시간 유형)를 가진 도우미 클래스 만 있습니다.

Joda-Time은 필드 패키지를 제공하지만 실제로는 새로운 필드 구현이 코딩하기가 매우 어렵다는 증거가 나타났습니다. 반면 Joda-Time은 JSR-310보다 훨씬 쉽고 우아하게 조작 할 수있는 이른바 속성 ( 예 : property.withMaximumValue ())을 제공 합니다.

캘린더 시스템

JSR-310은 4 개의 추가 캘린더 시스템을 제공합니다. 가장 흥미로운 것은 Umalqura (사우디 아라비아에서 사용)입니다. 다른 3 명은 Minguo (대만), 일본어 (1871 년 이후의 현대 달력 만!) 및 ThaiBuddhist (1940 년 이후에만 수정 됨)입니다.

Joda-Time은 Umalqura와 같은 조망 기반 달력이 아닌 계산기 기반을 기반으로 한 이슬람 달력을 제공합니다 . Thai-Buddhist는 Joda-Time도 비슷한 형태로 Minguo와 일본식으로 제공하지 않습니다. 그렇지 않으면 Joda-Time은 coptic 및 ethiopic calendar도 제공하지만 국제화를 지원하지 않습니다.

유럽인에게 더 흥미로운 : Joda-Time은 Gregorian , Julian 및 혼합 그레고리력 -줄리안 달력 도 제공합니다 . 그러나 날짜 기록에서 다른 연도 시작과 같은 중요한 기능이 전혀 지원되지 않기 때문에 실제 기록 계산의 실제 값이 제한됩니다 (동일한 비판이 구식에도 유효 함 java.util.GregorianCalendar).

히브리어 , 페르시아어 또는 힌두어 와 같은 다른 캘린더 는 두 라이브러리에서 완전히 누락되었습니다.

에포크 일

JSR-310에는 JulianFields 클래스 있으며 Joda-Time (버전 2.0)은 DateTimeUtils 클래스에서 일부 도우미 메소드를 제공합니다 .

시계

JSR-310에는 인터페이스 (디자인 실수)가 없지만 java.time.Clock모든 클럭 종속성 주입에 사용할 수 있는 추상 클래스 가 있습니다. Joda-Time은 대신 MillTimeProvider 인터페이스 와 DateTimeUtils의 일부 도우미 메소드를 제공 합니다. 따라서 Joda-Time은 다른 시계 (모의 등)로 테스트 구동 모델을 지원할 수 있습니다.

기간 산술

두 라이브러리 모두 하나 이상의 시간 단위로 시간 거리 계산을 지원합니다. 그러나 단일 단위 내구성을 처리 할 때 JSR-310 스타일은 분명히 더 좋습니다 (int를 사용하는 대신 긴 기반).

JSR-310 => long days = ChronoUnit.DAYS.between(date1, date2);

Joda-Time => int days = DAYS.daysBetween(date1, date2).getDays();

다중 단위 내구성의 처리 또한 다릅니다. 계산 결과조차도 다를 수 있습니다 (이 닫힌 Joda-Time 문제 참조) . JSR-310은 클래스 Period(년, 월, 일을 기준으로 한 기간) 및 Duration초 및 나노초를 기준으로 한 기간 만 사용하기 위해 매우 간단하고 제한된 접근 방식을 사용 하지만 Joda-Time은 클래스 PeriodType를 사용하여보다 정교한 방식 으로 제어합니다. 어떤 단위로 기간 (Joda-Time은 "기간"이라고 함)을 표현해야한다. 동안PeriodType-API는 JSR-310에서 제공하지 않는 비슷한 방식을 사용하는 것이 다소 어색합니다. 특히 JSR-310에서는 아직 날짜와 시간을 혼합하여 정의 할 수 없습니다 (예 : 요일 및 시간 기준). 따라서 한 라이브러리에서 다른 라이브러리로 마이그레이션하는 경우 경고하십시오. 토론중인 라이브러리는 부분적으로 동일한 클래스 이름에도 불구하고 호환되지 않습니다.

간격

JSR-310은이 기능을 지원하지 않지만 Joda-Time은 제한적으로 지원합니다. 이 SO 답변 도 참조하십시오 .

포맷팅과 파싱

두 라이브러리를 비교하는 가장 좋은 방법은 동일한 이름의 클래스 DateTimeFormatterBuilder (JSR-310)와 DateTimeFormatterBuilder (Joda-Time) 클래스를 보는 것 입니다. JSR-310-variant는 조금 더 강력합니다 ( TemporalField필드 구현자가 resolve () 와 같은 일부 확장 점을 코딩하도록 관리 한 경우 모든 종류를 처리 할 수 있음 ). 그러나 가장 중요한 차이점은 내 의견으로는 다음과 같습니다.

JSR-310은 표준 시간대 이름 (형식 패턴 기호 z)을 훨씬 더 잘 구문 분석 할 수 있지만 Joda-Time은 이전 버전에서는이 기능을 전혀 수행 할 수없고 현재는 매우 제한적인 방식으로 만 수행 할 수 있습니다.

JSR-310의 또 다른 장점은 러시아어 나 폴란드어 등의 언어에서 중요한 독립형 월 이름을 지원한다는 것입니다. Joda-Time은 Java-8 플랫폼이 아닌 이러한 리소스에 액세스 할 수 없습니다.

JSR-310의 패턴 구문은 Joda-Time보다 유연성이 뛰어나고 선택적 섹션 (대괄호 사용)을 허용하며 CLDR 표준을 향하고 패딩 (문자 기호 p)과 더 많은 필드를 제공합니다.

그렇지 않으면 Joda-Time은 PeriodFormatter를 사용하여 지속 시간의 형식을 지정할 수 있습니다 . JSR-310은이 작업을 수행 할 수 없습니다.


이 개요가 도움이 되길 바랍니다. 수집 된 모든 정보는 주로 더 나은 날짜 및 시간 라이브러리를 디자인하고 구현하는 방법과 조사 덕분에 주로 존재합니다 (아무것도 완벽하지 않습니다).

2015-06-24에서 업데이트 :

한편 Java에서 다른 시간 라이브러리에 대한 테이블 형식 개요 를 작성하고 게시 할 시간을 찾았습니다 . 이 테이블에는 Joda-Time v2.8.1과 Java-8 (JSR-310) 간의 비교도 포함되어 있습니다. 이 게시물보다 자세한 내용입니다.


12
이것은 뛰어난 게시물입니다. 이 모든 정보를 공유해 주셔서 감사합니다. Joda와 JSR-310 중에서 선택하면 (바닐라 사용 사례 만 해당), 어느 것을 선택 하시겠습니까? 나는 지금이 선택에 직면하고있다. JSR-310은 새로운 것이기 때문에 JSR-310을 고려하고 있으며 가능한 한 "앞으로 나아 가기"를 지원하려고합니다.
kevinarpe

7
@kevinarpe JSR-310과 Joda-Time 중 하나만 선택했다면 Joda-Time이 더 이상 개발을 거의 중단했기 때문에 JSR-310을 선호 할 것입니다 (새로운 큰 기능은 예상 할 수 없습니다-단지 버그 수정 및 작은 업데이트). 그리고 JSR-310의 디자인은 더 현대적이며 내부 품질이 우수합니다. 그러나 놀랍지 않게도, 내 실제 결정은 오히려 내 자신의 라이브러리 Time4J를 선호합니다. 내 게시물 맨 아래에 제공된 표 개요에 대한 링크도 참조하십시오. 항상 대안을 사용하는 것이 좋으며 필요한 기능에 따라 크게 달라집니다.
Meno Hochschild

Java8 버전의 간격이 지속되지 않습니까?
Christian Hujer

1
@ChristianHujer 아니요 java.time.Duration는 타임 라인에 고정 된 간격과 달리 시작 또는 끝을 쿼리 할 수 ​​없습니다. 이 JSR-310 유형은 알 수없는 시작 이후 경과 된 초와 나노초의 쌍입니다.
Meno Hochschild

42

자바 8 날짜 / 시간 :

  1. Java 8 클래스는 인간의 시간을 중심으로 구축됩니다. 인간의 날짜 / 시간 산술 / 변환을 위해 빠릅니다.
  2. getDayOfMonthJava 8 구현에서 날짜 / 시간 구성 요소 게터 는 O (1) 복잡성을 갖습니다.
  3. 의 구문 분석 OffsetDateTime/ OffsetTime/하기 ZonedDateTime때문에 JDK 내부적으로 던져 잡은 예외 매우 느린 자바 8 개의 B121입니다.
  4. 패키지의 집합 : java.time.*, java.time.chrono.*, java.time.format.*, java.time.temporal.*,java.time.zone.*
  5. 인스턴트 (타임 스탬프) 날짜 및 시간 부분 날짜 및 시간 파서 및 포맷터 시간대 서로 다른 연대기 (달력).
  6. 기존 클래스에는 Date와 같은 문제가 I18N 또는 L10N을 지원하지 않습니다. 그들은 변할 수 있습니다!
  7. 더 간단하고 강력합니다.
  8. 시계를 주입 할 수 있습니다.
  9. 고정 속성, 고정 클럭, 고정밀 클럭 (초, 전체 분 등)과 같은 다양한 속성으로 클럭을 생성 할 수 있습니다.
  10. 특정 시간대로 시계를 만들 수 있습니다. Clock.system(Zone.of("America/Los_Angeles")).
  11. 코드 처리 날짜 및 시간을 테스트 할 수 있습니다.
  12. 시간대와 독립적으로 테스트합니다.

조다 타임 :

  1. Joda-Time은 내부에서 기계 시간을 사용하고 있습니다. int / long 값을 기반으로하는 수동 구현이 훨씬 빠릅니다.
  2. Joda-Time 게터는 모든 Getter 호출에서 컴퓨터 대 사람 시간 계산이 필요하므로 이러한 시나리오에서 Joda-Time은 병목 현상이 발생합니다.
  3. 그것은 순간, 날짜 및 시간, 부분 및 지속 시간을 처리하는 불변 클래스로 구성됩니다. 유연합니다. 잘 설계되었습니다.
  4. 날짜를 순간으로 나타냅니다. 그러나 날짜 및 시간은 둘 이상의 순간에 해당 할 수 있습니다. 일광 절약 시간이 끝나는 시간 뿐만 아니라 전혀 해당하는 순간이 없습니다. 일광이 시작되는 간격 시간. 간단한 조작을 위해 복잡한 계산을 수행해야합니다.
  5. 대부분의 메소드에서 널을 유효한 값으로 승인합니다. 미묘한 버그로 이어집니다.

자세한 비교는 다음을 참조하십시오 :-

자바 8 날짜 / 시간 라이브러리 성능 (뿐만 아니라 Joda 타임 2.3 juCalendar) . 및 자바 8의 새로운 날짜 및 시간 API


"시간대와 독립적으로 테스트합니다."라고 말할 때 정확히 무엇을 의미합니까?
Zack

@Zack : 시간대에 따라 다르게 작동하는 코드를 테스트하는 경우 운영 체제에서 제공하는 것과 다른 기본 시간대로 테스트를 실행해야 할 수도 있습니다.
jarnbjo

Hah-joda 가 기계 시간이 아닌 타임 머신 에서 내부적으로 실행되었다고 말한 것 같습니다 ... 놀라지 않을 것입니다
Kyranstar

4
@ OO7 '인간의 시간'이란 무엇입니까? 어쨌든 기계에 의해 시간이 계산됩니다.
IgorGanapolsky

1

Joda-Time은 현재 유지 관리 모드입니다

질문에 대한 직접적인 대답은 아니지만 Joda-Time 프로젝트는 더 이상 활발히 개발되지 않습니다. 팀은 사용자가 최신 java.time API 로 마이그레이션 할 것을 제안합니다 . Oracle의 튜토리얼을 참조하십시오 .

공식 GitHub 프로젝트 페이지에서 :

표준 시간대 데이터를 최신 상태로 유지하는 것 외에는 Joda 시간이 더 이상 개발 중이 아닙니다. Java SE 8부터는이 프로젝트를 대체하는 JDK의 핵심 부분 인 java.time (JSR-310)으로 마이그레이션해야합니다. Android 사용자의 경우 java.time이 API 26+에 추가되었습니다. 더 낮은 API 레벨을 지원해야하는 프로젝트는 ThreeTenABP 라이브러리를 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.