Pochodzę ze świata C #, więc jeszcze nie mam doświadczenia z Javą. Właśnie Eclipse powiedział mi, że Date
jest przestarzałe:
Person p = new Person();
p.setDateOfBirth(new Date(1985, 1, 1));
Czemu? A co (szczególnie w przypadkach takich jak powyżej) powinno zostać użyte zamiast tego?
java
date
deprecated
Svish
źródło
źródło
Odpowiedzi:
Konkretny
Date
konstruktor jest przestarzały iCalendar
należy go zamiast tego użyć.JavaDoc
Dla Data opisuje których konstruktorzy są przestarzałe i jak je zastąpić użyciemCalendar
.źródło
java.util.Date
,java.util.Calendar
ijava.text.SimpleDateFormat
są teraz spuścizną , wyparte przez klasy java.time wbudowane w Javę 8 i nowsze wersje . Zobacz samouczek Oracle .java.util.Date
Klasa nie jest faktycznie przestarzałe, tak, że konstruktor, wraz z kilkoma innymi konstruktorami / metody są przestarzałe. Zostało przestarzałe, ponieważ tego rodzaju użycie nie działa dobrze w przypadku internacjonalizacji.Calendar
Klasa powinna być stosowana zamiast:Spójrz na datę Javadoc:
http://download.oracle.com/javase/6/docs/api/java/util/Date.html
źródło
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone(<timezone id>));
java.time.*
klasy są lepszą opcją ... jeśli zmieniasz kod.tl; dr
…lub…
Detale
Te
java.util.Date
,java.util.Calendar
orazjava.text.SimpleDateFormat
zajęcia były zbyt szybko, gdy rzucili Java zapoczątkowana i ewoluowały. Klasy nie zostały dobrze zaprojektowane ani wdrożone. Podjęto próby ulepszeń, a zatem znalezione przez ciebie środki wycofania. Niestety próby ulepszeń w dużej mierze zawiodły. Powinieneś całkowicie unikać tych klas . Są one wypierane w Javie 8 przez nowe klasy.Problemy w twoim kodzie
Plik java.util.Date ma datę i część czasu. Zignorowałeś część czasu w swoim kodzie. Zatem klasa Date zajmie początek dnia zgodnie z domyślną strefą czasową maszyny JVM i zastosuje ten czas do obiektu Date. Tak więc wyniki twojego kodu będą się różnić w zależności od tego, na której maszynie działa lub która strefa czasowa jest ustawiona. Prawdopodobnie nie to, czego chcesz.
Jeśli chcesz tylko datę, bez części czasu, na przykład datę urodzenia, możesz nie chcieć używać
Date
obiektu. Możesz zapisać tylko ciąg daty w formacie ISO 8601 zYYYY-MM-DD
. Lub użyjLocalDate
obiektu z Joda-Time (patrz poniżej).Joda-Time
Pierwsza rzecz do nauczenia się w Javie: Unikaj notorycznie kłopotliwych klas java.util.Date & java.util.Calendar w pakiecie z Javą.
Jak poprawnie zauważono w odpowiedzi użytkownika3277382 , użyj Joda-Time lub nowego pakietu java.time. * W Javie 8.
Przykładowy kod w Joda-Time 2.3
Zrzut do konsoli…
Po uruchomieniu…
java.time
W tym przypadku kod dla java.time jest prawie identyczny z kodem Joda-Time .
Otrzymujemy strefę czasową (
ZoneId
) i konstruujemy obiekt daty i godziny przypisany do tej strefy czasowej (ZonedDateTime
). Następnie, korzystając ze wzoru Immutable Objects , tworzymy nowe daty i godziny na podstawie tego samego momentu starego obiektu (liczba nanosekund od epoki ), ale przypisujemy inną strefę czasową. Wreszcie otrzymujemyLocalDate
strefę, która nie ma pory dnia ani strefy czasowej, choć zauważ, że strefa czasowa obowiązuje przy określaniu tej daty (nowy dzień zaczyna się wcześniej w Oslo niż na przykład w Nowym Jorku ).O java.time
Środowisko java.time jest wbudowane w Javę 8 i nowsze wersje . Klasy te kłopotliwe zastąpić stary starszych klas Date-Time, takich jak
java.util.Date
,Calendar
, iSimpleDateFormat
.Projekt Joda-Time , teraz w trybie konserwacji , zaleca migrację do klas java.time .
Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj stos przepełnienia dla wielu przykładów i wyjaśnień. Specyfikacja to JSR 310 .
Możesz wymieniać obiekty java.time bezpośrednio ze swoją bazą danych. Użyj sterownika JDBC zgodnego z JDBC 4.2 lub nowszym. Nie potrzeba ciągów, nie ma potrzeby
java.sql.*
klas.Gdzie można uzyskać klasy java.time?
Projekt ThreeTen-Extra rozszerza java.time o dodatkowe klasy. Ten projekt jest poligonem doświadczalnym dla ewentualnych przyszłych dodatków do java.time. Można znaleźć kilka przydatnych klas tutaj takie jak
Interval
,YearWeek
,YearQuarter
, i więcej .źródło
Jednym z powodów, dla których konstruktor jest przestarzały, jest to, że znaczenie parametru year nie jest zgodne z oczekiwaniami. Jawadok mówi:
Zauważ, że pole roku to liczba lat, które upłynęły od
1900
tego czasu , więc Twój przykładowy kod najprawdopodobniej nie spełni twoich oczekiwań. I o to chodzi.Ogólnie rzecz biorąc,
Date
interfejs API obsługuje tylko nowoczesny kalendarz zachodni, ma specyficznie określone komponenty i zachowuje się niespójnie, jeśli ustawisz pola.Calendar
IGregorianCalendar
API są lepsze niżDate
, a API Joda czasu 3rd-Party na ogół uważany za najlepszy. W Javie 8 wprowadzilijava.time
pakiety, które są teraz zalecaną alternatywą.źródło
Natknąłem się na to pytanie jako duplikat nowszego pytania, które zadawało w jaki sposób nieaktualny sposób na uzyskanie
Date
określonego roku, miesiąca i dnia.Dotychczasowe odpowiedzi mówią, że należy korzystać z
Calendar
klasy, i było to prawdą, dopóki nie pojawiła się Java 8. Ale od wersji Java 8 standardowy sposób to:A jeśli naprawdę potrzebujesz
java.util.Date
, możesz skorzystać z sugestii zawartych w tym pytaniu .Aby uzyskać więcej informacji, sprawdź interfejs API lub samouczki dotyczące języka Java 8.
źródło
Należy pamiętać, że
Calendar.getTime()
jest to niedeterministyczne w tym sensie, że pora dnia część domyślnie przyjmuje bieżącą godzinę.Aby odtworzyć, spróbuj uruchomić następujący kod kilka razy:
Wyjście np .:
Uruchomienie tego samego kodu kilka minut później daje:
Tak więc, chociaż
set()
zmusza odpowiednie pola do poprawienia wartości, przecieka czas systemowy dla pozostałych pól. (Testowane powyżej z Sun jdk6 i jdk7)źródło
Date
samo nie jest przestarzałe. To tylko wiele jego metod. Zobacz tutaj, aby uzyskać szczegółowe informacje .Użyj
java.util.Calendar
zamiast tego.źródło
Większość programistów Java korzysta obecnie z zewnętrznego pakietu Joda-Time . Jest powszechnie uważany za znacznie lepsze wdrożenie.
Java 8 będzie jednak miała nowy pakiet java.time. * . Zobacz ten artykuł, Wprowadzenie nowego interfejsu API daty i godziny dla JDK 8 .
źródło
Ponieważ konstruktor daty jest przestarzały, możesz wypróbować ten kod.
źródło
Date
iCalendar
w 2019 roku jest kiepską radą.Podobnie jak sugerował Binnyb, możesz rozważyć użycie nowszej metody Kalendarz> GregorianCalendar. Zobacz te nowsze dokumenty:
http://download.oracle.com/javase/6/docs/api/java/util/GregorianCalendar.html
źródło
Możesz stworzyć metodę taką jak
new Date(year,month,date)
w kodzie, używającCalendar
klasy.Będzie działać tak, jak przestarzały konstruktor
Date
źródło
Instant
a konkretnie iZonedDateTime
.Konstruktor daty oczekuje lat w formacie lat od 1900 r., Miesięcy zerowych, dni opartych na jednym, i ustawia godziny / minuty / sekundy / milisekundy na zero.
Tak więc używając przestarzałego kalendarza (lata zerowe, miesiące zerowe, dni bazowe) dla przestarzałego konstruktora daty, potrzebujemy czegoś takiego:
Lub używając Java 1.8 (który ma rok zerowy oraz miesiące i dni oparte na jednym):
Oto równe wersje Date, Calendar i Java 1.8:
źródło
(sposób wcześniejszy niż Java-8)
źródło