Joda는 표준 Java 시간보다 풍부하고 정교한 기능이지만 항상 최선의 방법은 아닙니다. Java 코드에서 Joda Time 또는 Java Time을 사용해야하는지 어떻게 결정합니까?
요구 사항에 따라 올바른 것을 선택하는 방법을 알려주는 지침이 있습니까?
Joda는 표준 Java 시간보다 풍부하고 정교한 기능이지만 항상 최선의 방법은 아닙니다. Java 코드에서 Joda Time 또는 Java Time을 사용해야하는지 어떻게 결정합니까?
요구 사항에 따라 올바른 것을 선택하는 방법을 알려주는 지침이 있습니까?
답변:
Joda Time은 Java 시간 라이브러리에 비해 다음과 같은 예외를 제외하고 거의 항상 올바른 선택입니다.
프로젝트에 타사 종속성을 추가하는 것이 어렵거나 바람직하지 않은 경우
공용 인터페이스에서의 사용으로 인해 문제가 발생하는 경우 (예 : ORM에서 java 및 Joda 시간 필드 모두 처리)
그러나 2)의 경우 가능하다면 내부적으로 Joda를 사용하는 것이 좋습니다.
위의 사항을 염두에 두어야하지만 드 물어야합니다. 의심스러운 경우 Joda와 함께 가십시오.
상의주의 Joda 타임 이 상태의 웹 사이트를 :
Java SE 8 이전의 표준 날짜 및 시간 클래스는 열악합니다. 이 문제를 미리 해결함으로써 Joda-Time은 사실상 Java의 표준 날짜 및 시간 라이브러리가되었습니다. Java SE 8부터는 사용자에게 java.time (JSR-310)으로 마이그레이션하라는 메시지가 표시됩니다.
Joda-Time 의 주요 기고자 인 jodastephen 는 http://www.threeten.org/ 와 관련된 GitHub 저장소 에서 볼 수 있듯이 JSR-310의 주요 기고자이기도합니다 . 그건 그렇고, jodastephen 은 SO 핸들도 가지고 있습니다 ...
Java 8 이후에 제공되는 새로운 Date and Time API로 편안하고 안전하다고 느낄 수 있다고 말하는 것이 안전하다고 생각합니다 .
몇 가지 추가 참조 :
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가 올바른 언어 선택이 아닐 수도 있습니다.
한 가지 더 요점 :
Java-Time (즉 Date
)은 ThreadSafe가 아니지만 JodaTime은입니다.
따라서 JodaTime은 다음과 같은 요구 사항이있을 때 선호됩니다.
또는 간단한 응용 프로그램의 경우 Java-Time은 괜찮습니다.
java.time
은 불변성을 통해 구현됩니다. stackoverflow.com/questions/9303532/…를 참조하십시오 . 이것은 단순하고 복잡한 응용 프로그램 모두에 잘 작동합니다. API 문서 에서도 "모든 클래스는 변경 불가능하고 스레드로부터 안전합니다"(문자 그대로 두 번째 단락에서 인용)되어 있습니다. 반면에 구식 java.util
수업에는 몇 가지 문제가 있습니다. 나는이 답변이 후자를 언급하지만, 지금 그 구별을하는 것이 중요하다는 것을 알고 있습니다.
업데이트 : 초기 버전의 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
, 그리고 더 .