2016-02-09 17 views
7

Istnieje cały zestaw klas wybranej dacie w Java 8:Jaką klasę dat użyć w języku Java 8?

  • java.time.LocalDateTime;
  • java.time.ZonedDateTime;
  • java.time.Instant;
  • java.time.OffsetDateTime;
  • java.sql.Timestamp;
  • java.util.Date.

Już zdałem na ich JavaDocs i zwróciłem uwagę, że wszystkie te klasy zawierają wszystkie potrzebne mi metody. Tak więc, na chwilę obecną mogę je wybierać losowo. Ale myślę, że jest jakiś powód, dla którego istnieje 6 oddzielnych klas i każda z nich poświęcona jest konkretnemu celowi.

techniczne Informacje & wymagania:

  1. wejście jest w String, który przekształca się w jednym z tych formatów datę.
  2. Nie muszę wyświetlać stref czasowych, ale kiedy porównuję dwie daty, ważne jest, aby móc poprawnie porównać czas w Nowym Jorku i Paryżu.
  3. Dokładny poziom to sekundy, nie ma potrzeby używania milisekund.
  4. Wymagane operacje:
    • znajdź maksymalną/min datę;
    • sortuj obiekty według daty;
    • obliczyć datę & przedział czasu (różnica między dwiema datami);
    • wstaw obiekty do MongoDB i pobierz je z bazy danych według daty (np. Wszystkie obiekty po określonej dacie).

Moje pytania:

  1. Które aspekty muszę pamiętać, aby wybrać optymalny format wśród tych czterech opcji z realizacji & punktów naprawiania widzenia?
  2. Czy jest jakikolwiek powód, dla którego powinienem unikać niektórych z tych klas daty?
+3

Obawiam się, to jest zbyt szerokie. Powinieneś zacząć od przeczytania Javadoc dla tych klas. Nie ma na to dobrej odpowiedzi. – Tunaki

+1

Nie używaj java.util.Date w języku Java 8. – keuleJ

+0

Najpierw zdefiniuj "zapisz datę"; wspomniałeś 'java.sql.Timestamp', czy to oznacza, że ​​zamierzasz przechować/pobrać z silnika RDBMS? Czy potrzebujesz informacji o strefie czasowej? – fge

Odpowiedz

6

Każdy z Date klas są na konkretne cele:

  • Jeśli chcesz użyć tej pory w kontekście SQL/JDBC użyj java.sql.Timestamp.

  • java.util.Date to stare API Java, nie jest bezpieczne dla wątków, trudno jest sobie poradzić z wyznaczaniem stref czasowych, a co najważniejsze, jest źle zaprojektowane: jedna prosta jednolitość to to, że miesiące zaczynają się od 1, a dni zaczynają się od 0.

  • java.time.LocalDateTime to niezmienny obiekt daty i czasu reprezentujący datę i godzinę, często widziany jako rok-miesiąc-dzień-godzina-minuta-sekunda, który potrzebujesz dokładnie.

  • java.time.ZonedDateTime klasa przechowuje wszystkie pola daty i godziny, więc można go używać do czynienia z wartościami takimi jak: 27th January 1990 at 15:40.30.123123123 +02:00 w Europa/Paris strefy czasowej.

Aby wykonać zadanie, klasa ZonedDateTime obsługuje konwersję z lokalnego czasu linii LocalDateTime do natychmiastowego czasowej linii Instant (które modele pojedynczy chwilowym punktem na linii czasu). Różnica między dwoma liniami czasu, reprezentowana przez ZoneOffset, jest przesunięciem od UTC/Greenwich.

Aby obliczyć czas trwania i okres: dostępny jest java.time.Duration, który jest zależny od czasu, np. "20,5 sekundy", i java.time.Period, który jest zależny od daty (np .: 26 lat, 2 miesiące i 2 dni).

Aby uzyskać max i min daty, można użyć Java 8 lambdy w coś takiego:

Date maxDate = list.stream().map(yourInstance -> yourInstance.date).max(Date::compareTo).get(); 
Date minDate = list.stream().map(yourInstance -> yourInstance.date).min(Date::compareTo).get();