Jak uzyskać aktualną datę i godzinę

342

Jak uzyskać aktualną datę i godzinę w Javie?

Szukam czegoś, co jest równoważne DateTime.Nowz C #.

mrblah
źródło
To pytanie jest starsze niż to Pytanie poprzednio oznaczone jako duplikat. Odwróciłem więc oznaczenie, ponownie otwierając to pytanie i zaznaczając nowe jako duplikat.
Basil Bourque,

Odpowiedzi:

414

Po prostu skonstruuj nowy Dateobiekt bez żadnych argumentów; spowoduje to przypisanie bieżącej daty i godziny do nowego obiektu.

import java.util.Date;

Date d = new Date();

Słowami Javadocs dla konstruktora zero-argumentowego :

Przydziela obiekt Date i inicjuje go, aby reprezentował czas, w którym został przydzielony , mierzony z dokładnością do milisekundy.

Upewnij się, że używasz, java.util.Datea nie java.sql.Date- ten drugi nie ma konstruktora z zerowym argumentem i ma nieco inną semantykę, która jest tematem zupełnie innej rozmowy. :)

delfuego
źródło
13
Zauważ też, że GregorianCalendar i wiele podobnych obiektów działa w ten sam sposób. Zatem niezależnie od typu obiektu daty / kalendarza, z którym pracujesz, konstruktor z argumentem zerowym zwykle inicjuje obiekt na bieżącą datę / godzinę.
Peter Di Cecco,
From Date doc: Od JDK 1.1 klasa Calendar powinna być używana do konwersji między polami daty i godziny, a klasa DateFormat powinna być używana do formatowania i analizy łańcuchów dat.
Paolo M,
9
Proszę rozważyć nowe interfejsy API Java8 - LocalDateTime.now () i ZonedDateTime.now ()
Oleg Mikheev
59

Klasy Java Data i Kalendarz są przez wielu uważane za źle zaprojektowane. Powinieneś spojrzeć na Joda Time , bibliotekę powszechnie używaną zamiast wbudowanych bibliotek daty Java.

Odpowiednikiem DateTime.Noww Joda Time jest:

DateTime dt = new DateTime();

Aktualizacja

Jak zauważono w komentarzach, najnowsze wersje Joda Time mają DateTime.now()metodę, więc:

DateTime dt = DateTime.now();
cdmckay
źródło
4
Obecna (2.1) wersja Jody wydaje się mieć statyczną metodę DateTime.now () (opcjonalnie akceptuje DateTimeZone lub Chronology). joda-time.sourceforge.net/apidocs/org/joda/time/…
Roman A. Taycher
1
Pamiętaj, że ta odpowiedź została opublikowana w 2010 roku. Java 8 pochłonęła wiele najlepszych funkcji Joda Time. Aby uzyskać więcej informacji, zobacz oficjalną dokumentację i wiele innych artykułów online.
DavidS,
36

tl; dr

Instant.now()

java.time

Klasa java.util.Date została przestarzała w nowym pakiecie java.time ( samouczek ) w Javie 8 i nowszych. Stare klasy java.util.Date/.Calendar są niezwykle kłopotliwe, mylące i mają wady. Unikaj ich.

ZonedDateTime

Uzyskaj aktualny moment w java.time.

ZonedDateTime now = ZonedDateTime.now();

A ZonedDateTimeobejmuje:

  • Data.
  • Pora dnia, z ułamkiem sekundy do rozdzielczości nanosekundowej .
  • Strefa czasowa.

Jeśli nie określono strefy czasowej, bieżąca domyślna strefa czasowa maszyny JVM jest przypisywana w trybie cichym. Lepiej określić żądaną / oczekiwaną strefę czasową niż domyślnie polegać na domyślnych.

ZoneId z = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime zdt = ZonedDateTime.now( z );

UTC

Generalnie lepiej jest przyzwyczaić się do wykonywania zadań zaplecza (logiki biznesowej, bazy danych, przechowywania, wymiany danych) - wszystko w strefie czasowej UTC . Powyższy kod domyślnie opiera się na bieżącej domyślnej strefie czasowej maszyny JVM.

InstantKlasa reprezentuje moment na osi czasu UTC z rozdzielczością nanosekund.

Instant instant = Instant.now();

InstantKlasa podstawowa klasa budynku blok w java.time i może być często używana w kodzie.

Gdy potrzebujesz większej elastyczności formatowania, zmień na OffsetDateTime. Określ ZoneOffsetobiekt. W przypadku UTC użyj przydatnej stałej dla UTC .

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );

Strefa czasowa

Łatwo dostosujesz się do innej strefy czasowej w celu prezentacji użytkownikowi. Użyj prawidłowej nazwy strefy czasowej , nigdy 3-4-literowych kodów, takich jak ESTlub IST.

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime nowMontreal = instant.atZone( z );

Wygeneruj reprezentację ciągu dla tej wartości daty i godziny, zlokalizowanej.

String output = DateTimeFormatter
    .ofLocalizedDate( FormatStyle.FULL )
    .withLocale( Locale.CANADA_FRENCH )
    .format ( nowMontreal );

Instant

Lub, aby pozostać w UTC, użyj Instant. InstantObiekt reprezentuje moment na osi czasu, do rozdzielczości nanosekundy, zawsze w UTC. Zapewnia to blok konstrukcyjny strefowej daty i godziny oraz przypisanie strefy czasowej. Możesz myśleć o tym koncepcyjnie w ten sposób:

ZonedDateTime= Instant+ZoneId

Możesz wyodrębnić Instantz ZonedDateTime.

Instant instantNow = zdt.toInstant();

Możesz zacząć od Instant. Nie trzeba tutaj określać strefy czasowej, jak Instantzawsze w UTC.

Instant now = Instant.now();
Basil Bourque
źródło
Wysłałem również inną odpowiedź z dalszymi szczegółami na temat duplikatu pytania.
Basil Bourque,
14

W Javie 8 jest to:

ZonedDateTime dateTime = ZonedDateTime.now();
Vitalii Fedorenko
źródło
12
import java.util.Date;   
Date now = new Date();

Zauważ, że obiekt Date jest zmienny i jeśli chcesz zrobić coś wyszukanego, użyj jodatime .

Chandra Patni
źródło
10

java.lang.System.currentTimeMillis(); zwróci datę / godzinę od epoki

użytkownik243773
źródło
Dobry do logowania, ale wymaga analizowania i konwersji w celu wyświetlenia użytkownikowi
Rishi Dua,
6
import org.joda.time.DateTime;

DateTime now = DateTime.now();
gordy
źródło
5

Jeśli utworzysz nowy obiekt Date, domyślnie zostanie on ustawiony na bieżącą godzinę:

import java.util.Date;
Date now = new Date();
parkerfath
źródło
3

Java zawsze nie zapewniała odpowiedniej obsługi przypadków użycia daty i godziny. Na przykład istniejące klasy (takie jak java.util.Datei SimpleDateFormatter) nie są bezpieczne dla wątków, co może prowadzić do problemów z współbieżnością. Istnieją również pewne wady w API. Na przykład lata java.util.Datezaczynają się o 1900, miesiące zaczynają się od 1, a dni zaczynają od 0 - niezbyt intuicyjnie. Problemy te doprowadziły do ​​popularności zewnętrznych bibliotek daty i godziny, takich jak Joda-Time. Aby uwzględnić nową datę i godzinę, interfejs API został zaprojektowany dla Java SE 8.

LocalDateTime timePoint = LocalDateTime.now();
System.out.println(timePoint);

Zgodnie z dokumentem :

Metoda now()zwraca bieżącą datę i godzinę przy użyciu zegara systemowego i domyślnej strefy czasowej, a nie zerowej . Bieżącą datę i godzinę uzyskuje z zegara systemowego w domyślnej strefie czasowej. Spowoduje to zapytanie zegara systemowego w domyślnej strefie czasowej w celu uzyskania bieżącej daty i godziny. Zastosowanie tej metody zapobiegnie możliwości użycia alternatywnego zegara do testowania, ponieważ zegar jest zakodowany na stałe.

akhil_mittal
źródło