tl; dr
LocalDate.of( 1985 , 1 , 1 )
…lub…
LocalDate.of( 1985 , Month.JANUARY , 1 )
Detale
Te java.util.Date
, java.util.Calendar
oraz java.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 z YYYY-MM-DD
. Lub użyj LocalDate
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
DateTimeZone timeZoneNorway = DateTimeZone.forID( "Europe/Oslo" );
DateTime birthDateTime_InNorway = new DateTime( 1985, 1, 1, 3, 2, 1, timeZoneNorway );
DateTimeZone timeZoneNewYork = DateTimeZone.forID( "America/New_York" );
DateTime birthDateTime_InNewYork = birthDateTime_InNorway.toDateTime( timeZoneNewYork );
DateTime birthDateTime_UtcGmt = birthDateTime_InNorway.toDateTime( DateTimeZone.UTC );
LocalDate birthDate = new LocalDate( 1985, 1, 1 );
Zrzut do konsoli…
System.out.println( "birthDateTime_InNorway: " + birthDateTime_InNorway );
System.out.println( "birthDateTime_InNewYork: " + birthDateTime_InNewYork );
System.out.println( "birthDateTime_UtcGmt: " + birthDateTime_UtcGmt );
System.out.println( "birthDate: " + birthDate );
Po uruchomieniu…
birthDateTime_InNorway: 1985-01-01T03:02:01.000+01:00
birthDateTime_InNewYork: 1984-12-31T21:02:01.000-05:00
birthDateTime_UtcGmt: 1985-01-01T02:02:01.000Z
birthDate: 1985-01-01
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 otrzymujemy LocalDate
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 ).
ZoneId zoneId_Norway = ZoneId.of( "Europe/Oslo" );
ZonedDateTime zdt_Norway = ZonedDateTime.of( 1985 , 1 , 1 , 3 , 2 , 1 , 0 , zoneId_Norway );
ZoneId zoneId_NewYork = ZonedId.of( "America/New_York" );
ZonedDateTime zdt_NewYork = zdt_Norway.withZoneSameInstant( zoneId_NewYork );
ZonedDateTime zdt_Utc = zdt_Norway.withZoneSameInstant( ZoneOffset.UTC ); // Or, next line is similar.
Instant instant = zdt_Norway.toInstant(); // Instant is always in UTC.
LocalDate localDate_Norway = zdt_Norway.toLocalDate();
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
, i SimpleDateFormat
.
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 .