java 사용법 변환 - 왜 joda java.util.Calendar 또는 jsr 310 대신 date4j를 사용하면 안됩니까?




1 Answers

나는 date4j를 지금까지 보지 못했지만, 문서를 읽었습니다. 그리고 나는 그것에 대해 하나의 구체적인 문제와 한 가지 의견을 가지고 있습니다.

첫째, 구체적인 문제. 내부적으로 시간대를 유지하지 않습니다. 따라서 일광 절약에 대해서는 애매 모호합니다. 일요일로 오전 1시 59 분 59 초 (EDT)가 오전 1시 (EST)가되는 전환을 생각해보십시오. 분명히 그날 오전 1시 30 분은 모호합니다. 그 시간은 두 번 일어납니다. 그래서 다음은 모호하다.

new DateTime("2011-11-06 01:30:00")

둘째, 제 생각입니다. Date 문제는 Timezone을 유지하지 못했다는 것입니다. 캘린더가 생길 무렵에는 피해가 발생했습니다. 게다가, Calendar 자체는 변경 될 수있는 어떤 호의도하지 않았습니다. 그러나 마음에, 해결책은 순간을 포함해야하지만, 그것이 인식 된 곳은 - 시간대, 문화, 로케일 등입니다. 이것들은 데이터베이스에 저장되고, 직렬화되고, 의사 소통되며, 무엇이든간에 유지되어야합니다. 이와 같은 개인적인 원칙으로 인해 xsd : dateTime조차도 UTC를 기준으로 날짜 + 시간을 단순히 표현할 수 있기 때문에 짧다고 제안합니다. 예를 들어 일광 절약 시간이 준수되고 있는지 여부를 제공하는 조항이 없습니다.

설정 time

저는 최근에 date4j 라는 매우 간단한 라이브러리 (본질적으로 단일 클래스)를 통해 Java로 날짜를 다루기 시작했습니다. 개념적으로, 저는 date4j의 "아이디어"를 정말 좋아합니다. 사실, javadoc의 전체 메인 사이트와 문서를 모두 읽은 후에 나는 명시된 모든 것에 거의 동의합니다.

이제 date4j를 사용하지 않아야하는 몇 가지 이유가있을 있습니다 - 버그, 성능, 사용자 부족 등. 나는 그런 것에 대해 묻지 않습니다. 개념적으로, date4j에 대한 아이디어가 무엇이 잘못 되었습니까 (대다수의 응용 프로그램). 분명히 joda 또는 threeten과 같은 것을 필요로하는 응용 프로그램이있을 수 있습니다. 그러나 나는 그 응용 프로그램이 소수에 속한다고 믿습니다.

사람들이 날짜 / 시간 (자바 앱을 작성하는 거의 모든 사람들)을 다루는 사람들에게주는 일반적인 조언은 다음과 같습니다.

  • java.util.Calendar 대신 joda-time을 사용하십시오.
  • 웹 서버를 UTC로 설정하십시오.
  • 데이터베이스 서버를 UTC로 설정하십시오.
  • 귀하의 날짜 - 시간을 UTC로 저장하십시오.

사실 마지막 세 글 머리 기호는 날짜를 가지고 작업 할 때 사람들이 가지고있는 현재 정신 모델의 문제점을 보여줍니다. 사람들은 응용 프로그램과 데이터베이스 수준 모두에서 시간대를 관리하려고합니다 (ORM 프레임 워크가 다른 것을 복잡하게 만드는 또 다른 추상 계층을 추가하는 것은 말할 필요도 없음).

당신은 그런 일을해서는 안됩니다. 예를 들어, java.util.Calendar를 사용하고 있으며 일부 사용자 정의 시간대에서 시간을 조작하고있는 경우 :

Calendar c = Calendar.getInstance(TimeZone.getTimeZone("America/New_York"));
c.set(Calendar.YEAR, 2011);
c.set(Calendar.MONTH, 0);
c.set(Calendar.DAY_OF_MONTH, 1);
c.set(Calendar.HOUR_OF_DAY, 3);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);

이것은 시간대와 관계없이 시간의 "순간"을 나타냅니다. 당신은 어떤 종류의 "변환"이 일어날 지 걱정하지 않고이 시간을 데이터베이스에서 유지할 수 있어야합니다. 데이터베이스가 상하이 시간대에 있고 웹 서버가 로스 앤젤레스 시간대에 있는지 여부는 중요하지 않습니다. 즉, 시간은 즉각적으로 동일합니다.

하나의 문제는 데이터베이스가 여러분을 위해 시간대를 관리하려고 시도한다는 것입니다 (저는 여러분, Postgres! grr!을보고 있습니다) 그리고 JDBC 드라이버 레벨에서의 동작이 벤더에 따라 다르다는 것입니다 - 즉 PreparedStatement.setDate / getDate.

date4j가 사용하는 정신 모델은 모든 혼란을 제거하는 것처럼 보입니다. 예를 들어 now ()를 호출 할 때 명시 적으로 강제로 시간대를 제공합니다. 라이브러리 사용에 대한 사이트의 권장 사항은 다음과 같습니다 (이전에 이미 내 자신의 앱에서 이미 수행하고 있었던 사항).

  • 시간대 관리를 시도하는 데이터베이스 유형을 사용하지 마십시오.
  • 시간대를 별도의 열로 저장합니다 (필요한 경우).

왜 더 많은 사람들이 date4j와 같은 도서관을 채택하지 않는가?




Related