조다 시간과 자바 시간


19

Joda는 표준 Java 시간보다 풍부하고 정교한 기능이지만 항상 최선의 방법은 아닙니다. Java 코드에서 Joda Time 또는 Java Time을 사용해야하는지 어떻게 결정합니까?

요구 사항에 따라 올바른 것을 선택하는 방법을 알려주는 지침이 있습니까?


5
Java 8에 포함 된 새로운 Date & Time API 를 사용하여 두 가지 이점을 모두 누리십시오 . Joda Time의 영향을 많이받습니다. 실제로 주요 저자는 Joda Time의 저자 Stephen Colebourne입니다.
Joachim Sauer

1
@JoachimSauer 최종 릴리스에 등장 했습니까 아니면 Java 8이 출시 될 때 이런 일이 발생합니까?
m3th0dman

@ m3th0dman : 최종 Java 8 릴리스에 포함되며 아직 릴리스되지 않았습니다. GA는 현재 2013-09-09로 예정되어 있습니다.
Joachim Sauer

Joda-Time 및 원래 Java 날짜-시간 클래스는 이제 Java 8, Java 9 이상에 내장 된 java.time 클래스에 의해 수정 되었습니다.
Basil Bourque

답변:


29

Joda Time은 Java 시간 라이브러리에 비해 다음과 같은 예외를 제외하고 거의 항상 올바른 선택입니다.

  1. 프로젝트에 타사 종속성을 추가하는 것이 어렵거나 바람직하지 않은 경우

  2. 공용 인터페이스에서의 사용으로 인해 문제가 발생하는 경우 (예 : ORM에서 java 및 Joda 시간 필드 모두 처리)

그러나 2)의 경우 가능하다면 내부적으로 Joda를 사용하는 것이 좋습니다.

위의 사항을 염두에 두어야하지만 드 물어야합니다. 의심스러운 경우 Joda와 함께 가십시오.


"내부 Joda 사용"의 의미를 알려주십시오. 나는 초보자이며이 모든 것을 모릅니다.
Jedi Knight

5
@Jedi Knight : 애플리케이션이 자체 로직에 Joda를 사용하고 필요한 외부 시스템과 통신 할 때만 java.util.Date로 /에서 변환 함을 의미합니다.
Michael Borgwardt

2
'내부'에 의해 (Michael의 예에서와 같이) 전체적으로 응용 프로그램 내부에있을 수 있지만 클래스 내부 또는 특정 메서드 내부에있을 수 있습니다. 예를 들어 두 개의 Java Date 객체를 가져 와서 그 사이의 작업 일 수를 계산하는 유틸리티 메소드가 있다고 가정하지만 버그가 있습니다. 이 문제를 해결하려면 JodaTime을 사용하여 해당 메소드를 다시 작성하는 것이 훨씬 쉬울 수 있지만 메소드를 호출하는 모든 코드를 리팩터링하는 데 시간을 할애 할 수 없으므로 메소드 서명을 변경하지 마십시오. 이 경우 해당 방법에서 Joda를 "내부"로 사용합니다.
Robert Johnson

참고로 Joda-Time 프로젝트는 이제 유지 보수 모드 에 있으며 팀은 java.time 클래스 로의 마이그레이션을 조언합니다 . Oracle의 Tutorial을 참조하십시오 .
Basil Bourque

13

상의주의 Joda 타임 이 상태의 웹 사이트를 :

Java SE 8 이전의 표준 날짜 및 시간 클래스는 열악합니다. 이 문제를 미리 해결함으로써 Joda-Time은 사실상 Java의 표준 날짜 및 시간 라이브러리가되었습니다. Java SE 8부터는 사용자에게 java.time (JSR-310)으로 마이그레이션하라는 메시지가 표시됩니다.

Joda-Time 의 주요 기고자 인 jodastephenhttp://www.threeten.org/ 와 관련된 GitHub 저장소 에서 볼 수 있듯이 JSR-310의 주요 기고자이기도합니다 . 그건 그렇고, jodastephen 은 SO 핸들도 가지고 있습니다 ...

Java 8 이후에 제공되는 새로운 Date and Time API로 편안하고 안전하다고 느낄 수 있다고 말하는 것이 안전하다고 생각합니다 .

몇 가지 추가 참조 :


12

Java 표준 날짜 API는 근본적으로 손상되어 Joda Time을 JVM의 라이브러리 확장에 간단히 추가하여 다른 Java API와 함께 기본적으로 클래스 경로에로드되도록 고려했습니다.

국제화 및 시간대를 레거시 Java 애플리케이션으로 개조하는 작업을 수행 한 후 표준 Java API 만 사용하려고 시도한 경우, 내가 의미하는 바를 이해할 것입니다. 수천 개의 asinine 코드 행을 100 개 미만 으로 바꿀 수있었습니다 . 생산성 향상은 상상할 수 없습니다.

또한 표준 날짜 API는 직관적이지 않으며, 유동적 인 Joda API는 몇 주가 아닌 몇 시간 내에 픽업 할 수 있습니다. 2 마일 떨어진 섬에 가려고하는 것과 비슷한 점은 다음과 더 비슷합니다.

1) 단 6 분만에 섬으로 갈 수있는 모터 보트.

또는...

2) 가장 친한 친구가 배구 인 미친 사람에 의해 조종되는 허리케인 동안 덩굴과 함께 묶인 임시 대나무 뗏목.

다른 답변에서 언급했듯이, Hibernate는 이제 Joda 유형 Bean 특성을 데이터베이스 날짜 / 시간 필드에 맵핑 할 수있는 플러그인을 가지고 있기 때문에 ORM과 같은 몇 가지 단점이 존재하지 않고 있습니다. JPA도 이에 대한 답을 가질 수 있습니다.

디스크 공간과 관련하여 데스크톱 응용 프로그램으로 최소한의 설치 공간을 원하는 응용 프로그램을 원한다면 Java가 올바른 언어 선택이 아닐 수도 있습니다.


참고로 Joda-Time 프로젝트는 이제 유지 보수 모드 에 있으며 팀은 java.time 클래스 로의 마이그레이션을 조언합니다 . Oracle의 Tutorial을 참조하십시오 .
Basil Bourque

8

한 가지 더 요점 : Java-Time (즉 Date)은 ThreadSafe가 아니지만 JodaTime은입니다. 따라서 JodaTime은 다음과 같은 요구 사항이있을 때 선호됩니다.

  • 공통 자원에 액세스하는 다중 스레드 환경
  • 상황과 같은 중앙 집중식 시간 동기화

또는 간단한 응용 프로그램의 경우 Java-Time은 괜찮습니다.


DateTime조차도 ThreadSafe가 아닙니다. 내가 잘못 가고 있다면 나를 수정하십시오.
vintesh

3
DateTime 클래스를 포함하여 대부분의 Joda 라이브러리는 변경할 수 없으므로 스레드로부터 안전합니다. 그러나 스레드로부터 안전하지 않은 가변 클래스가 몇 가지 있습니다. joda-time.sourceforge.net/faq.html#threading을 참조하십시오 .
Robert Johnson

1
스레드 안전성 java.time은 불변성을 통해 구현됩니다. stackoverflow.com/questions/9303532/…를 참조하십시오 . 이것은 단순하고 복잡한 응용 프로그램 모두에 잘 작동합니다. API 문서 에서도 "모든 클래스는 변경 불가능하고 스레드로부터 안전합니다"(문자 그대로 두 번째 단락에서 인용)되어 있습니다. 반면에 구식 java.util수업에는 몇 가지 문제가 있습니다. 나는이 답변이 후자를 언급하지만, 지금 그 구별을하는 것이 중요하다는 것을 알고 있습니다.
YoYo

날짜 시간을 불변의 값으로 나타내지 않는 것은 단지 미쳤다. 나는 그것이 지금 고쳐 졌음을 알고 있지만 실제로 세상에서 그들은 무엇을 생각하고 있었습니까?
Aluan Haddad

2

java.time의 프레임 워크는 대체 모두 기존의 날짜 - 시간 클래스와 Joda 타임을

업데이트 : 초기 버전의 Java와 함께 제공되는 이전 날짜-시간 클래스는 이제 레거시이며, 공식적 으로 Java 8, Java 9 이상에 내장 된 java.time 클래스로 대체되었습니다 .

Date, Calendar, SimpleDateFormat, 그리고 java.sql.*날짜 - 시간 클래스는 모두 피해야한다. 혼란스럽고 번거롭고 잘 설계되지 않은 클래스를 사용할 필요는 없습니다. 그것들은 전적으로 java.time 클래스로 대체됩니다. 그들의 유일한 목적은 기존의 기존 코드를 유지하는 것입니다. 이전 코드와 인터페이스 할 때 이전 클래스에 추가 된 새 메소드를 호출하여 java.time으로 /에서 변환 할 수 있습니다. 변환에 대한 자세한 정보는 java.util.Date를 "java.time"유형 으로 변환을 참조하십시오. .

Joda 타임 프로젝트는 지금에 유지 관리 모드 의로 마이그레이션을 조언 java.time의 클래스. Joda-Time 프로젝트는 java.time 프레임 워크에 영감을주었습니다. 둘 다 같은 사람인 Stephen Colebourne이 이끈다 . java.time은 모든 새로운 코드 인 Joda-Time의 재 작성 / 재 설계로 생각할 수 있지만 업계 최초의 포괄적이고 정교한 날짜-시간 라이브러리를 구축하여 수년 동안 배운 것을 사용합니다.

자세한 내용은 Oracle Tutorial을 참조하십시오 . 많은 예제와 설명을 보려면 스택 오버플로를 검색하십시오.

많은 java.time 기능은 자바 6 & 7 백 포팅 ThreeTen - 백 포트 추가에 적응 안드로이드ThreeTenABP (참조 ... 사용 방법 ).

ThreeTen - 추가 프로젝트 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 입증 된 근거입니다. 당신은 여기에 몇 가지 유용한 클래스와 같은 찾을 수 있습니다 Interval, YearWeek, YearQuarter, 그리고 .

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