Java 날짜 및 시간 클래스를 사용해야합니까 아니면 Joda Time과 같은 타사 라이브러리를 사용해야합니까?


147

전 세계 국가에서 사용할 웹 기반 시스템을 만들고 있습니다. 저장해야하는 한 가지 유형의 데이터는 날짜와 시간입니다.

Joda 시간 과 같은 타사 라이브러리와 비교하여 Java 날짜 및 시간 클래스 사용의 장단점은 무엇입니까 ? 나는 이러한 타사 라이브러리가 좋은 이유 때문에 존재한다고 생각하지만 실제로는 실제로 비교하지 않았습니다.


5
몇 가지 의견을 명확히하기 위해… Joda-Time이 계속되는 동안 후속 JSR 310 : 날짜 및 시간 API 는 실제로 java.time 패키지 에서 Java 8의 일부로 예정되어 있습니다 . 오라클은 튜토리얼 초안을 가지고 있습니다 . JDBC 4.2 새로운 데이터 유형을 처리 합니다.
Basil Bourque

답변:


197

편집 : 이제 Java 8이 릴리스되었으므로 사용할 수 있다면 그렇게하십시오! java.time내 생각에 Joda Time보다 더 깨끗합니다. 그러나 Java-8 이전 버전이 붙어 있으면 계속 읽으십시오 ...

Max는 Joda 사용의 장단점을 요청했습니다 ...

장점 :

  • 잘 작동합니다. Joda에는 표준 Java 라이브러리보다 버그가 훨씬 적습니다. Java 라이브러리의 일부 버그는 디자인으로 인해 수정하기가 어렵습니다 (불가능하지는 않지만).
  • "현지 시간"(예 : "어디서나 오전 7시에 깨우십시오") 개념과 시간 ( "제임스 전화" 오후 3시 (태평양 표준시), 현재 위치는 오후 3 시가 아닐 수 있지만 동일한 순간입니다. ")
  • 나는 그것이 더 쉽게 시간대 데이터베이스를 업데이트 할 수 있습니다 믿지 않는 변화를 비교적 자주를
  • 불변성 스토리가 좋기 때문에 인생을 훨씬 쉽게 IME로 만들 수 있습니다.
  • 불변성으로 인해 모든 포맷터는 스레드로부터 안전합니다. 거의 항상 응용 프로그램을 통해 단일 포맷터를 재사용하기를 원하기 때문에 훌륭 합니다.
  • java.timeJava 8 학습 은 약간 유사하기 때문에 학습 을 시작할 수 있습니다.

단점 :

  • 배우는 또 다른 API입니다 (문서는 꽤 좋지만)
  • 빌드하고 배포하는 또 다른 라이브러리입니다.
  • Java 8을 사용할 때 여전히 기술을 마이그레이션하기위한 작업이 있습니다.
  • DateTimeZoneBuilder과거 에는 효과적으로 사용하지 못했습니다 . 이것은 매우 드문 사용 사례입니다.

작은 API를 효과적으로 구축한다는 oxbow_lakes의 아이디어에 응답하기 위해 이것이 왜 나쁜 아이디어인지에 대한 나의 견해는 다음과 같습니다.

  • 일 이네 왜 이미 당신을 위해 일했을 때 일합니까?
  • 팀에 새로 온 사람은 자체 개발 한 API보다 Joda에 훨씬 익숙 할 것입니다.
  • 가장 간단한 용도 이외의 문제는 잘못 될 가능성이 있습니다. 처음에는 간단한 기능 만 필요 하다고 생각 하더라도 한 번에 조금씩 더 복잡 해지는 습관이 있습니다. 날짜 및 시간 조작 을 제대로 수행 하기가 어렵 습니다. 또한 내장 Java API는 올바르게 사용하기 가 어렵습니다 . 달력 API의 날짜 / 시간 산술 작동 방식에 대한 규칙을 살펴보십시오. 이 위에 무엇이든 구축하는 것은 잘 설계된 라이브러리를 사용하는 것보다는 나쁜 생각입니다.

5
@adi : 업데이트 됨-여전히 유효하지만 JSR-310은 Java 8의 일부이지만 Java 7의 일부는 아니길 바랍니다 .
Jon Skeet

2
@JonSkeet 이것은 아마도 java-8 도입 이후 업데이트되어야 할 것입니다.
Sionnach733

@ Sionnach733 : 모든 것을 업데이트하지는 않지만 처음에는 무언가를 추가 할 것입니다.
Jon Skeet

2
java.time.*Java 6 및 7 에 대한 백 포트가 있습니다 . threeten.org/threetenbp
Miscreant

24

글쎄, Java 8을 기다리지 않는 한 날짜와 시간을 처리 하기 위해 더 나은 API 를 구현 하기를 희망한다면 Joda-Time을 사용하십시오 . 시간을 절약하고 많은 두통을 피하십시오.


장점과 단점? 나는 Joda 시간을 사용한 적이 없습니다. 사람들이 그것에 대해 좋아하는 것을 듣는 것이 재미있을 것입니다.
맥스 스튜어트

15

대답은 : 그것은 의존한다

JODA (및 JSR-310)는 여러 달력 시스템에서 사용할 수있는 기능을 포함하여 모든 기능을 갖춘 날짜 / 시간 라이브러리입니다.

개인적으로 JODA는 내가 필요로하는 복잡성 측면에서 너무 한 걸음 인 것으로 나타났습니다. 표준 Java DateCalendar클래스 에서 2 가지 주요 (IMHO) 실수는 다음 과 같습니다.

  1. 그들은 변하기 쉬워
  2. 그들은 즉각적인 시간에서 1 년의 개념을 섞습니다.

이것들은 JODA에 의해 다루어 지지만 실제 "calendrical"계산을 위해 자바 클래스를 사용하는 YearMonthDayand Instant에 대한 클래스를 롤링하는 것이 매우 쉽다는 것을 알 수 있습니다 . 그런 다음 100 개 이상의 클래스, 다른 형식 지정 / 구문 분석 메커니즘 등의 API를 익히지 않아도됩니다.

물론, 다른 연대기 (예 : 히브리어)를 완전히 표현해야하거나 자신의 가상 캘린더 시스템 (예 : 작성중인 게임)을 정의하려는 경우 JODA 또는 JRS-310이 적합합니다. 그렇지 않다면, 자신의 롤링이 가능할 것이라고 제안합니다.

JSR-310 스펙 리더는 1 위에 JODA를 작성한 Stephen Colebourne이므로 JODA를 논리적으로 대체 합니다.


16
비전문가 IMO가 재발 명 해서는 안됩니다 .
Jon Skeet

6
나는 바보도 아니지만 Java D & T API에 여전히 문제가 있습니다. 고통스럽게 오용하기 쉽습니다. 사람들이 Joda를 올바르게 사용할 수있는 이유는 Joda가 더 잘 설계 되었기 때문에 올바른 일을 하도록 권장 하기 때문입니다.
Jon Skeet

6
날짜 / 시간 API와 관련하여 요일 중 언제든지 전문가를 신뢰합니다. 다른 사람이 사용하지 않는 임의의 타사 API가 아닙니다. "> 100 개의 클래스"논증은 밀짚 꾼입니다. 분명히 모든 것을 배울 필요는 없기 때문입니다.
Jon Skeet

5
나는 우리가 다른 것에 동의해야 할 것 같아요. 전문가에 의해 작성된 모든 trustworth 날짜 / 시간 날 시간 arithment와 더러운 일을하는 것을 방지 잘 설계된,로 계산 뷰의 내 관점에서 "이 있어야합니다." 작년에 나는 열정으로 인간의 시간 측정을 미워하는 법을 배웠습니다.
Jon Skeet

5
Joda가 존재할 때 자신을 굴리는 것은 단순히 끔찍한 생각입니다. 하지 마십시오. Joda에는 사용하지 않을 수십 개의 클래스가 있다는 것이 사실이지만 이에 대한 대답은 매우 간단합니다. 필요없는 클래스는 사용하지 마십시오. 이 유형의 라이브러리를 작성하는 데 잘못 될 수있는 많은 것들이 있습니다. 개발과 테스트에서 많은 노력을 기울여야합니다. 또는 하나의 라이브러리 만 추가 할 수 있습니다. 그런 다음 Joda는 팀의 신입 사원이 이전에 사용해 보았을 수도있는 추가 혜택을 제공하지만 자체 개발 한 라이브러리를 사용하지는 않습니다.
Dawood ibn Kareem

7

그것은 당신이 날짜로 무엇을하고 있는지에 달려 있습니다. 단순히 유지하는 경우 Java의 내장 날짜는 아마도 원하는 모든 것을 할 것입니다. 그러나 광범위한 시간 날짜 조작을 수행하는 경우 Joda를 사용하는 것이 좋습니다.


7

다음과 같은 이유로 Joda-Time 라이브러리를 사용해야합니다.

  1. Joda-Time은 표준 날짜 표시 방식 인 ISO 8601 표준을 지원합니다
    .
  2. Joda-Time에서 일 / 월 / 년을 더하고 빼는 것이 java.util.date보다 쉽습니다.
  3. Joda-Time에서는 제공 날짜 별 초기화가 훨씬 쉽습니다.
  4. Joda-Time은 시간대도 지원합니다.
  5. Joda-Time에는 더 나은 내장 구문 분석 기능이 있습니다. "2014-02-31"과 같은 잘못된 날짜가 오류로 발생합니다.Exception in thread "main" org.joda.time.IllegalFieldValueException: Cannot parse "2014-02-31": Value 31 for dayOfMonth must be in the range [1,28].

자세한 내용은이 페이지를 참조하십시오 : http://swcodes.blogspot.com/

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