IT이야기

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

cyworld 2022. 6. 13. 22:28
반응형

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

java.util에 관한 질문이 있는 것으로 알고 있습니다.날짜와 Joda-Time.하지만 좀 더 자세히 살펴본 결과, java.time API(JSR 310에 의해 정의Java 8의 새로운 기능)와 Joda-Time의 차이점에 대한 스레드를 찾을 수 없었습니다.

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

  • java.time은 Joda-Time이 할 수 없는 것은 무엇입니까?
  • java.time이 Joda-Time보다 나은 점은 무엇입니까?
  • java.time을 사용하면 성능이 향상됩니까?

공통 기능

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

b) 게다가, 두 라이브러리 모두, Eric Evans의 디자인 연구Time And Money」나, 도메인 주도의 스타일에 관한 Martin Fowler의 아이디어로부터 영감을 받아, 어느 정도 유창한 프로그래밍 스타일을 목표로 하고 있습니다(항상 완벽하지는 않지만).

c) 양쪽 라이브러리를 사용하여 실제 달력 날짜 유형을 얻을 수 있습니다.LocalDate, 실제 벽 시간 유형(착신)LocalTime및 구성(착신자)LocalDateTime옛날과 비교하면 큰 승리입니다.java.util.Calendar그리고.java.util.Date.

d) 두 라이브러리 모두 방법 중심의 접근방식을 사용하고 있으며, 이는 사용자에게 사용을 권장한다는 것을 의미합니다.getDayOfYear()대신get(DAY_OF_YEAR)이 때문에, 보다 많은 추가의 방법이 발생합니다.java.util.Calendar(단, 후자는 ints의 과도한 사용으로 인해 타입 세이프가 전혀 아닙니다).

성능

포인트 3(예외 캐치)은 아마도 사용되지 않을 수 있지만 @OO7이 미하일 Vorontsov의 분석을 지적하는 다른 답변을 참조하십시오. 이 JDK 버그를 참조하십시오.퍼포먼스가 다른(일반적으로 JSR-310에 유리한) 것은, Joda-Time의 내부 실장이 항상 머신 타임과 같은 롱 프라이머리티브(밀리초 단위)를 사용하고 있기 때문입니다.

특수한 순서

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

정확

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

지원되는 필드:

Java-8(JSR-310)에서 지원되는 필드에 대한 개요는 시간 패키지의 일부 클래스(ChronoFieldWeekFields 등)에서 제공되지만 이 영역에서는 Joda-Time이 다소 약합니다(DateTimeFieldType 참조).Joda-Time의 가장 큰 부족은 현지화된 주간 관련 필드가 없다는 것입니다.두 필드 구현 설계의 공통적인 특징은 둘 다 long 유형(다른 유형이나 enum도 아님)의 값을 기반으로 한다는 것입니다.

열거형

JSR-310은 다음과 같은 기능을 제공합니다.DayOfWeek또는MonthJoda-Time은 주로 Java 5 이전인 2002-2004년에 개발되었기 때문에 이 기능을 제공하지 않습니다.

존 API

a) JSR-310은 Joda-Time보다 더 많은 타임존 기능을 제공합니다.후자는 시간대 오프셋 이행 이력에 대한 프로그램접근을 할 수 없지만 JSR-310은 이를 수행할 수 있습니다.

b) 참고로: JSR-310은 내부 타임존 저장소를 새로운 장소와 다른 형식으로 옮겼습니다.이전 라이브러리 폴더 lib/zi는 더 이상 존재하지 않습니다.

조정기 vs.소유물

JSR-310은TemporalAdjuster시간 계산과 조작을 외부화하는 공식화된 방법으로서의 인터페이스, 특히 라이브러리나 프레임워크 라이터의 경우 이것은 JSR-310의 새로운 확장을 포함시키는 멋지고 비교적 쉬운 방법이다(기존의 정적 도우미 클래스와 동등한 종류).java.util.Date).

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

Joda-Time은 필드 패키지를 제공하지만, 새로운 필드 구현은 코드화하기가 매우 어렵다는 것이 실증되었습니다.반면 Joda-Time은 JSR-310보다 훨씬 쉽고 우아하게 조작할 수 있는 이른바 속성을 제공합니다.Maximum Value()를 사용합니다.

캘린더 시스템

JSR-310에는 4개의 캘린더 시스템이 추가되어 있습니다.가장 흥미로운 것은 우말쿠라(사우디아라비아에서 사용)입니다.다른 세 가지는 민구오(대만), 일본어(1871년 이후 현대 달력만!), 태국불교(1940년 이후만 정확)이다.

Joda-Time은 Umalqura와 같은 목격 기반의 달력이 아닌 계산 기반의 이슬람 달력을 제공합니다.태국 불교도 조다타임에서 민구오, 일본 불교도 비슷한 형태로 제공하고 있다.그렇지 않으면 Joda-Time은 콥틱과 에티오피아 달력도 제공한다(그러나 국제화에 대한 지원은 없다).

유럽인들에게는 더 흥미로운 것: Joda-Time은 또한 그레고리력, 율리우스력, 그리고 그리스 율리우스력을 제공한다.그러나 날짜 이력에서 다른 연도 시작과 같은 중요한 기능은 전혀 지원되지 않기 때문에 실제 이력 계산에 대한 실질적인 가치는 제한된다(같은 비판은 오래된 경우에도 유효하다).java.util.GregorianCalendar).

히브리어, 페르시아어, 힌두교와 같은 다른 달력들은 두 도서관 모두에서 완전히 사라졌다.

에폭스 데이즈

JSR-310에는 JulianFields 클래스가 있으며 Joda-Time(버전 2.0)에는 DateTimeUtils 클래스의 도우미 메서드가 몇 가지 있습니다.

시계

JSR-310에는 인터페이스가 없고(설계상의 실수) 추상적인 클래스가 있습니다.java.time.Clock모든 클럭 의존성 주입에 사용할 수 있습니다.Joda-Time은 대신 인터페이스 MillisProvider 및 일부 도우미 메서드를 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- JSR-310에서는 API가 전혀 제공되지 않습니다.특히, JSR-310에서는, 날짜와 시간의 혼재 기간을 정의할 수 없습니다(예를 들면, 요일과 시간에 근거해).따라서 라이브러리에서 다른 라이브러리로 이행할 경우 주의하시기 바랍니다.클래스 이름이 부분적으로 동일함에도 불구하고 논의 중인 라이브러리가 호환되지 않습니다.

인터벌

JSR-310은 이 기능을 지원하지 않지만 Joda-Time은 제한된 지원을 제공합니다. SO-Answer도 참조하십시오.

포맷 및 해석

두 라이브러리를 비교하는 가장 좋은 방법은 동일한 이름의 클래스 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)의 비교도 포함되어 있습니다.이 게시물보다 더 상세합니다.

Java 8 날짜/시간:

  1. Java 8 클래스는 인간 시대에 만들어졌다.이를 통해 인간 날짜/시간 산술/변환 속도가 빨라집니다.
  2. 날짜/시간 컴포넌트의 취득처getDayOfMonthJava 8 구현에 O(1) 복잡성이 있습니다.
  3. 해석OffsetDateTime/OffsetTime/ZonedDateTimeJava 8 ea b121 에서는, JDK 로 내부로 송신되어 검출된 예외에 의해, 매우 느립니다.
  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. 타임존에 의존하지 않고 테스트를 실시합니다.

Joda-Time:

  1. Joda-Time은 내부에서 머신타임을 사용하고 있습니다.int/long 값에 기반한 수동 구현이 훨씬 빠릅니다.
  2. Joda-Time getter는 모든 getter 호출에 대해 컴퓨터 대 인간 시간 계산을 필요로 하므로 이러한 시나리오에서 Joda-Time은 병목현상이 됩니다.
  3. Instants, Date & Time, Partials 및 Durations를 처리하는 불변의 클래스로 구성되어 유연성이 뛰어난 설계입니다.
  4. 날짜를 인스턴스로 나타냅니다.그러나 날짜와 시간은 두 개 이상의 순간에 해당될 수 있습니다.서머타임이 종료되는 오버랩 시간.거기에 해당하는 순간이 전혀 없는 것과 마찬가지입니다.동이 트기 시작하는 갭 아워.간단한 작업을 위해 복잡한 계산을 수행해야 합니다.
  5. 대부분의 메서드에서 null을 유효한 값으로 받아들입니다.미묘한 버그로 이어집니다.

자세한 비교는 다음을 참조해 주세요.

Java 8 날짜/시간 라이브러리 성능(Joda-Time 2.3 및 j.u도 포함)캘린더)참조해 주세요.Java 8의 새로운 날짜와 시각 API

Joda-Time이 유지보수 모드로 전환되었습니다.

질문에 대한 직접적인 답변은 아니지만 Joda-Time 프로젝트는 더 이상 진행 중이 아닙니다.이 팀은 사용자가 새로운 java.time API로 이행할 것을 권장합니다.Oracle의 튜토리얼을 참조하십시오.

공식 GitHub 프로젝트 페이지:

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

이 프로젝트는 JSR 310의 Joda-Time(Stephen Colebourne)과 Oracle의 공동 주도로 진행되어 새로운 Java SE 8 패키지 java.time에 등장합니다.

https://www.oracle.com/technical-resources/articles/java/jf14-date-time.html

언급URL : https://stackoverflow.com/questions/24631909/differences-between-java-8-date-time-api-java-time-and-joda-time

반응형