IT

Java Date & Time API의 문제점은 무엇입니까?

itgroup 2022. 11. 17. 21:09
반응형

Java Date & Time API의 문제점은 무엇입니까?

자바에 대한 .Date및 기타 날짜 관련 수업.가 되는 것.NET 개발자 실 net net net사사사사사 ( NET Developer )

누가 이것 좀 밝혀줄 수 있어요?

★★★★★★★★★★★★★★★★★★★★★★.Date서부터 시작할까요디서서 츠요시

JavaDoc을 읽으면 개발자들이 실제로 좋은 아이디어를 가지고 있다고 생각할 수 있다.UTC와 GMT의 차이는 기본적으로 윤초(매우 드물게 발생)라는 사실에도 불구하고 UTC와 GMT의 차이에 대해 자세히 설명합니다.

그러나 설계 결정으로 인해 제대로 설계된 API라는 생각이 전혀 들지 않게 되었습니다.다음은 자주 볼 수 있는 실수입니다.

  • 밀레니엄의 마지막 10년에 설계되었지만 1900년 이후 두 자리 숫자로 평가됩니다.이 진부한 결정의 결과로 자바 세계에는 말 그대로 수백만 개의 회피책이 있습니다.
  • 은 제로는 월 의 요소 배열과 않는 첫 번째 요소 배열에는 0개의 월이 포함되어 .null그 결과, 0.11(오늘은 109년의 11번째 달)이 됩니다.문자열로 변환하기 위해 월마다 ++와 --의 수가 비슷합니다.
  • 그들은 변이할 수 있다.따라서 날짜를 되돌리려면(예를 들어 인스턴스 구조로서) 날짜 객체 자체 대신 해당 날짜의 복제본을 반환해야 합니다(반드시 그렇지 않으면 다른 사용자가 구조를 변환할 수 있습니다).
  • Calendar이 문제를 '수정'하도록 설계되어 있습니다.실제로 같은 실수를 저지릅니다.여전히 변이 가능해요
  • Date.DateTimejava.sql.Date이는 1일을 나타냅니다(단, 관련된 타임존은 없습니다).
  • TimeZone Date를 들면, 「는, 자주 부터 자정까지 임의의

마지막으로 윤초는 보통 1시간 이내에 ntp로 갱신되는 양호한 시스템클럭에 대해 수정됩니다(위 링크 참조).특히 새로운 버전의 코드를 수시로 재배치해야 하는 점을 고려할 때 시스템이 2윤초(최소 6개월마다, 실질적으로 몇 년마다) 동안 가동될 가능성은 매우 낮습니다.클래스를 재생성하거나 WAR 엔진과 같은 동적 언어를 사용해도 클래스 공간이 오염되어 결국 기능이 고갈됩니다.

Java 8에서 오래된 날짜 시간 클래스를 java.time으로 대체한 JSR 310은 다음과 같이 원래 JSR로 정당화됩니다.

2.5 Java 커뮤니티의 요구는 제안된 사양에 의해 해결됩니까?

현재 Java SE에는 java.util이라는2개의 다른 날짜와 시각 API가 있습니다.날짜 및 java.util.캘린더두 API 모두 웹로그 및 포럼에서 Java 개발자가 사용하기 어려운 것으로 일관되게 기술되어 있습니다.특히 둘 다 몇 개월 동안 제로 인덱스를 사용하므로 많은 버그가 발생합니다.Calendar는 주로 내부적으로 두 가지 다른 방식으로 상태를 저장하기 때문에 수년간 많은 버그와 성능 문제에 시달려 왔습니다.

하나의 클래식 버그(4639407)로 인해 캘린더 오브젝트에 특정 날짜가 생성되지 않았습니다.일부 사용자가 정확한 생년월일을 입력할 수 없도록 하는 효과가 있는 몇 년 후에는 날짜를 만들 수 있는 일련의 코드를 작성할 수 있다.이것은 캘린더 클래스가 여름에 여름 시간 1시간만 벌 수 있도록 허용했기 때문에 발생했는데, 그 때는 역사적으로 2차 세계대전 무렵에 2시간이 추가되었다.이 버그는 현재 수정되어 있지만, 향후 어느 시점에서 한 국가가 여름에 3시간 이상의 서머타임 게인을 도입하기로 선택했다면 캘린더 클래스는 다시 중단될 것입니다.

현재 Java SE API는 멀티 스레드 환경에서도 문제가 발생합니다.불변의 클래스는 상태를 변경할 수 없기 때문에 본질적으로 스레드 세이프인 것으로 알려져 있습니다.그러나 날짜와 달력은 모두 변경 가능하므로 프로그래머가 복제와 스레드를 명시적으로 고려해야 합니다.또한 Date Time Format의 스레드 안전성 결여는 널리 알려져 있지 않으며 스레드화 문제를 추적하기 어려운 원인이 되고 있습니다.

Java SE가 날짜별로 가지고 있는 클래스의 문제뿐만 아니라, 다른 개념을 모델링하기 위한 클래스는 없습니다.시간대 이외의 날짜 또는 시간, 기간, 기간 및 간격은 Java SE에서 클래스를 나타내지 않습니다.그 결과 개발자들은 int를 사용하여 시간을 나타내며 javadoc은 단위를 지정합니다.

또한 포괄적인 날짜 및 시간 모델이 없기 때문에 많은 일반적인 작업이 필요 이상으로 까다로워집니다.예를 들어, 두 날짜 사이의 일 수를 계산하는 것은 현재 특히 어려운 문제입니다.

이 JSR에서는, 날짜와 시각(타임 존의 유무에 관계없이), 기간과 기간, 간격, 포맷, 해석 등, 완전한 날짜와 시각 모델의 문제에 대해 설명합니다.

  • 날짜 인스턴스는 변경할 수 있으며, 이는 거의 항상 불편합니다.
  • 그들은 이중적인 성질을 가지고 있다.타임 스탬프와 달력 날짜를 모두 나타냅니다.이것은 날짜 계산을 할 때 문제가 있는 것으로 나타났습니다.
  • 달력 데이터의 숫자 표현은 대부분의 경우 직관에 반합니다.예를 들어 다음과 같습니다.getMonth()제로 베이스입니다.getYear()1900을 기반으로 합니다(즉, 2009년은 109로 표시됩니다).
  • 이러한 기능에는 고객이 기대하는 많은 기능이 결여되어 있습니다.Date학급.

안쓰럽다...전자로서NET 프로그래머, 저는 같은 질문을 했습니다.의 시간 API입니다.NET(타임스팬, 연산자 오버로드)는 매우 편리합니다.

먼저 특정 날짜를 작성하려면 사용되지 않는 API를 사용하거나 다음 중 하나를 사용합니다.

Calendar c = Calendar.getInstance();
c.set(2000, 31, 12)

하루를 빼기 위해 당신은 다음과 같은 나쁜 짓을 한다.

Date firstDate = ...
Calendar c = Calendar.getInstance();
c.setTime(fistDate);
c.add(Calendar.DATE,-1);
Date dayAgo = c.getTime();

혹은 더 나쁜

Date d = new Date();
Date d2 = new Date(d.getTime() - 1000*60*60*24);

두 날짜 사이의 시간(일/주/월)을 확인하려면...더 나빠지다

단, Apache로부터의 Date Utils (org.apache.commons.lang.time.DateUtils는, 저는 하고 있다는 을 알게 .

Brabster가 썼듯이 Joda Time은 좋은 외부 라이브러리이기도 하지만 Apache는 다른 어떤 것보다 더 "흔한" 것 같습니다.

솔직히 자바 날짜 API를 사용할 수 있다고 생각합니다. 여러 유용한 을 할 수 있다는 점, 즉 개의 수업이 하다는 점, 즉 장황함, 장황당함, 황당함, 황당함, 황당함, 황당함, 황당함, 황당함, 황당함, 황당함, 황당함, 황당함 등입니다.Calendar,Date,DateFormat/SimpleDateFormat 단순한 도 있습니다.getDayOfWeek().

Joda Time은 Java에서 잘 알려진 대체 API이며, Why Joda Time 섹션에서 왜 이것이 관심 있는 실행 가능한 대체 API인지에 대해 몇 가지 더 설명합니다.

언급URL : https://stackoverflow.com/questions/1969442/whats-wrong-with-java-date-time-api

반응형