2010-05-25 27 views

Odpowiedz

43

Cóż, z dwóch powiązanych powodów. Była to bardzo słaba implementacja pojęcia Daty i Czasy i została zastąpiona przez klasę Calendar.

Klasy Calendar, choć poprawa, pozostawia wiele do życzenia, więc dla poważnej pracy Data/czas, wszyscy polecają Joda-Time. Java 8 przynosi nowy java.time.* package, zainspirowany przez Joda-Time, zdefiniowany przez JSR-310 i ma zastąpić stare klasy Data/Kalendarz.

Edytuj: W odpowiedzi na konkretne pytanie, dlaczego wdrożenie jest złe, jest wiele przyczyn. JavaDoc podsumowuje następująco:

Niestety interfejs API tych funkcji nie podlegał internacjonalizacji.

Oprócz tego ogólnego niedoboru (która obejmuje kwestie jak brak komponentu strefy czasowej, jak również formatowanie daty, która jest lepiej obsługiwane w DateFormat i niemożność uzyskania niż gregoriański reprezentacji kalendarzowym), nie są konkretne problemy, które naprawdę szkodzą klasie Date, w tym fakt, że rok jest przedstawiony w offsecie 1900 z roku Common Era.

Calendar ma swoje własne problemy, ale nawet już w JDK 1.1 było oczywiste, że java.util.Date nie zamierza go uciąć. Mimo że Calendar jest argumentem, że jest najgorszym interfejsem API JDK, to do wersji 7 próbuje go adresować.

+9

Czyste przejście z niewystarczającego do niezrozumiałego w jdk 1.1 :) – msandiford

+0

Również klasa "Data" została nazwana słabo. Powinni go nazwać Czasem lub Datą Czasową. –

10

Są one przestarzałe, ponieważ Data została napisana tak szybko, jak to możliwe, w dniu, w którym chciały one sprowadzić JDK do drzwi.

Okazuje się, że daty i kalendarze są trudne. Stworzyli więc klasę Kalendarza, o wiele bardziej przemyślaną, aby poradzić sobie z trudnymi aspektami pracy z kalendarzami.

Wycofano metody dat i przekazano je do Kalendarza, ponieważ nie chciały one zmienić zachowania istniejących metod Date i prawdopodobnie przerwać istniejące aplikacje.

16
  • Date jest zmienny
  • Date nie posiada wsparcie dla stref czasowych

Ten ostatni doprowadził do niej zastąpione Calendar. I były w połączeniu z łatwości użycia, prowadzić zarówno zastąpione Joda-Time/JSR-310 (java.time.* package)

+0

JSR-310, a nie JSR-313. – Jesper

+8

Dziękuję IBM za Kalendarz, DateFormatter i wszystkie inne powiązane bzdury. Kolejny świetny przykład nadmiernego uziemienia bez faktycznego rozwiązania problemu. –

0

nie wiem oficjalny powód, dlaczego została wycofana, ale o ile mogę powiedzieć GregorianCalendar i Joda-Time obsługuje operacje na datach, co oznacza, że ​​można na przykład dodać dzień do daty i odpowiednio zmienić jego miesiąc i rok.

Na przykład, powiedz, że chcesz obliczyć dzień po aktualnej dacie, a dzisiaj jest 31 maja; z java.util.Date, masz po prostu getDays() +1, który zwraca 32, i musisz zająć się wiedzą, że bieżący miesiąc nie ma 32 dni przez siebie; z GregorianCalendar lub Joda.time dodanie dnia do 31 maja powoduje, że obiekt reprezentuje 1 czerwca, ukrywając złożoność przed wzrokiem.

+2

Twój przykład nie jest problemem z obiektem Date, ale z kodem, który go używa. Gregorian Kalendarium zrobi dokładnie to samo. Więc cały ten punkt jest dyskusyjny. – Supericy

2

Oto dobra odpowiedź prosto z Oracle: http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html

Wieloletnia Bugbear programistów Java było niewystarczające wsparcie dla daty i czasu użytkowania przypadków zwykłych programistów.

Na przykład istniejące klasy (takie jak java.util.Date i SimpleDateFormatter) nie są wątkowo bezpieczne, co prowadzi do potencjalnych problemów dotyczących współbieżności dla użytkowników - nie jest to coś, czego przeciętny programista spodziewałby się rozwiązać podczas pisania kodu obsługi daty.

Niektóre z klas daty i godziny również wykazują dość słabą konstrukcję interfejsu API. Na przykład lata java.util.Date zaczynają się od 1900, miesiące zaczynają od 1, a dni zaczynają się od 0 - niezbyt intuicyjne.

... reprezentuje chwilę na osi czasu - opakowanie o liczbie milli sekund od czasu UNIX-a, ale jeśli wywołasz toString(), wynik sugeruje, że ma strefę czasową, powodując zamieszanie programistów.

+0

Wygląda na to, że autor nie zadał sobie trudu, żeby sprawdzić swój artykuł. Zgodnie z dokumentacją online Java [java.util.Date] (http://docs.oracle.com/javase/7/docs/api/java/util/Date.html) dni zaczynają się od '1' i miesięcy zaczynają się od '0'. Oba odpowiadają interfejsowi API systemu UNIX, patrz [time.h] (http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/time.h.html). –

Powiązane problemy