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.
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. :)
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.
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 =newDateTime();
Aktualizacja
Jak zauważono w komentarzach, najnowsze wersje Joda Time mają DateTime.now()metodę, więc:
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.
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 .
Ł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.
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:
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.
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.
Odpowiedzi:
Po prostu skonstruuj nowy
Date
obiekt bez żadnych argumentów; spowoduje to przypisanie bieżącej daty i godziny do nowego obiektu.Słowami Javadocs dla konstruktora zero-argumentowego :
Upewnij się, że używasz,
java.util.Date
a niejava.sql.Date
- ten drugi nie ma konstruktora z zerowym argumentem i ma nieco inną semantykę, która jest tematem zupełnie innej rozmowy. :)źródło
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.Now
w Joda Time jest:Aktualizacja
Jak zauważono w komentarzach, najnowsze wersje Joda Time mają
DateTime.now()
metodę, więc:źródło
tl; dr
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.
A
ZonedDateTime
obejmuje: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.
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.
Instant
Klasa reprezentuje moment na osi czasu UTC z rozdzielczością nanosekund.Instant
Klasa 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ślZoneOffset
obiekt. W przypadku UTC użyj przydatnej stałej dla 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
EST
lubIST
.Wygeneruj reprezentację ciągu dla tej wartości daty i godziny, zlokalizowanej.
Instant
Lub, aby pozostać w UTC, użyj
Instant
.Instant
Obiekt 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:Możesz wyodrębnić
Instant
zZonedDateTime
.Możesz zacząć od Instant. Nie trzeba tutaj określać strefy czasowej, jak
Instant
zawsze w UTC.źródło
Wolę używać obiektu kalendarza.
Łatwiej jest mi pracować. Możesz także pobrać obiekt Data z Kalendarza.
http://java.sun.com/javase/6/docs/api/java/util/GregorianCalendar.html
źródło
Calendar.getInstance()
W Javie 8 jest to:
źródło
Zauważ, że obiekt Date jest zmienny i jeśli chcesz zrobić coś wyszukanego, użyj jodatime .
źródło
java.lang.System.currentTimeMillis();
zwróci datę / godzinę od epokiźródło
źródło
Jeśli utworzysz nowy obiekt Date, domyślnie zostanie on ustawiony na bieżącą godzinę:
źródło
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.Date
iSimpleDateFormatter
) 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 latajava.util.Date
zaczynają 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 jakJoda-Time
. Aby uwzględnić nową datę i godzinę, interfejs API został zaprojektowany dla Java SE 8.Zgodnie z dokumentem :
źródło