Jak uzyskać informacje o roku, miesiącu, dniu, godzinach, minutach, sekundach i milisekundach bieżącego momentu w Javie? Chciałbym mieć je jako Strings
.
104
Możesz użyć do tego getterów java.time.LocalDateTime
.
LocalDateTime now = LocalDateTime.now();
int year = now.getYear();
int month = now.getMonthValue();
int day = now.getDayOfMonth();
int hour = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();
int millis = now.get(ChronoField.MILLI_OF_SECOND); // Note: no direct getter available.
System.out.printf("%d-%02d-%02d %02d:%02d:%02d.%03d", year, month, day, hour, minute, second, millis);
Lub, jeśli nie jesteś jeszcze w Javie 8, skorzystaj z java.util.Calendar
.
Calendar now = Calendar.getInstance();
int year = now.get(Calendar.YEAR);
int month = now.get(Calendar.MONTH) + 1; // Note: zero based!
int day = now.get(Calendar.DAY_OF_MONTH);
int hour = now.get(Calendar.HOUR_OF_DAY);
int minute = now.get(Calendar.MINUTE);
int second = now.get(Calendar.SECOND);
int millis = now.get(Calendar.MILLISECOND);
System.out.printf("%d-%02d-%02d %02d:%02d:%02d.%03d", year, month, day, hour, minute, second, millis);
Tak czy inaczej, to się teraz drukuje:
2010-04-16 15: 15: 17.816
Aby przekonwertować int
na String
, użyj String#valueOf()
.
Jeśli mimo wszystko zamierzasz ułożyć i wyświetlić je w przyjaznym dla człowieka formacie ciągu, lepiej użyj Java8 java.time.format.DateTimeFormatter
( samouczek tutaj ),
LocalDateTime now = LocalDateTime.now();
String format1 = now.format(DateTimeFormatter.ISO_DATE_TIME);
String format2 = now.atZone(ZoneId.of("GMT")).format(DateTimeFormatter.RFC_1123_DATE_TIME);
String format3 = now.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss", Locale.ENGLISH));
System.out.println(format1);
System.out.println(format2);
System.out.println(format3);
lub jeśli nie korzystasz jeszcze z Javy 8, użyj java.text.SimpleDateFormat
:
Date now = new Date(); // java.util.Date, NOT java.sql.Date or java.sql.Timestamp!
String format1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH).format(now);
String format2 = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH).format(now);
String format3 = new SimpleDateFormat("yyyyMMddHHmmss", Locale.ENGLISH).format(now);
System.out.println(format1);
System.out.println(format2);
System.out.println(format3);
Tak czy inaczej, daje to:
2010-04-16T15: 15: 17.816 Piątek, 16 kwietnia 2010 15:15:17 GMT 20100416151517
SimpleDateFormat
lubDateTimeFormatter
za to konkretne zadanie :)new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH).format(new Date());
Przełącz się na czas joda i możesz to zrobić w trzech wierszach
Masz również bezpośredni dostęp do poszczególnych pól daty bez korzystania z kalendarza.
Dane wyjściowe są następujące:
Według http://www.joda.org/joda-time/
źródło
źródło
W przypadku wersji Java 8 i nowszych użyj pakietu java.time .
ZonedDateTime.now()
jest metodą statyczną zwracającą bieżącą datę i godzinę z zegara systemowego w domyślnej strefie czasowej. Wszystkie metody get zwracająint
wartość.źródło
LocalDateTime
jest do tego niewłaściwą klasą. Pozbawiona koncepcję strefy czasowej lub offsetu z-UTC, to nie może być wykorzystywane do śledzenia określonym momencie, to nie punkt na osi czasu. UżyjInstant
,ZonedDateTime
lubOffsetDateTime
zamiast tego.ZonedDateTime
.tl; dr
ZonedDateTime
Aby uchwycić bieżący moment, jak widać na zegarze ściennym używanym przez mieszkańców określonego regionu (strefy czasowej), użyj
ZonedDateTime
.Strefa czasowa ma kluczowe znaczenie przy ustalaniu daty. W dowolnym momencie data różni się na całym świecie według strefy. Na przykład, kilka minut po północy w Paryżu Francja jest nowym dniem, podczas gdy w Montrealu Quebec wciąż trwa „wczoraj” .
Jeśli nie określono strefy czasowej, maszyna JVM niejawnie stosuje swoją bieżącą domyślną strefę czasową. To ustawienie domyślne może się zmienić w dowolnym momencie w trakcie działania (!), Więc wyniki mogą się różnić. Lepiej jest jawnie określić żądaną / oczekiwaną strefę czasową jako argument.
Określ prawidłową nazwę strefy czasowej w formacie
continent/region
, takie jakAmerica/Montreal
,Africa/Casablanca
lubPacific/Auckland
. Nigdy nie używaj 3-4-literowego skrótu, takiego jakEST
lub,IST
ponieważ nie są to prawdziwe strefy czasowe, nie znormalizowane, a nawet nie unikalne (!).Zadzwoń do dowolnego z wielu pobierających, aby wyciągnąć fragmenty daty i czasu.
W java.time klasy rozwiązania do nanosekund . Twoje pytanie zadawało ułamek sekundy w milisekundach . Oczywiście można podzielić przez milion, aby skrócić nanosekundy do milisekund, kosztem możliwej utraty danych. Lub użyj
TimeUnit
wyliczenia do takiej konwersji.DateTimeFormatter
Aby utworzyć
String
łączenie fragmentów tekstu, użyjDateTimeFormatter
class. Wyszukaj przepełnienie stosu, aby uzyskać więcej informacji na ten temat.Instant
Zwykle najlepiej jest śledzić momenty w UTC. Aby dostosować strefową datę i godzinę do UTC, wyodrębnij plik
Instant
.I wróć ponownie.
LocalDateTime
Kilka innych odpowiedzi korzysta z tej
LocalDateTime
klasy. Ta klasa nie jest odpowiednia do celów śledzenia rzeczywistych momentów, określonych momentów na osi czasu, ponieważ celowo nie ma pojęcia strefy czasowej lub przesunięcia względem czasu UTC.Więc do czego jest
LocalDateTime
dobre? Użyj,LocalDateTime
jeśli zamierzasz zastosować datę i godzinę w dowolnej lokalizacji lub we wszystkich lokalizacjach , a nie tylko w jednej określonej lokalizacji.Na przykład Boże Narodzenie w tym roku zaczyna się o godz
LocalDateTime.parse( "2018-12-25T00:00:00" )
. Ta wartość nie ma znaczenia, dopóki nie zastosujesz strefy czasowej (aZoneId
), aby uzyskaćZonedDateTime
. Boże Narodzenie przypada najpierw na Kiribati , a później w Nowej Zelandii i dalekowschodniej Azji. Kilka godzin później Boże Narodzenie zaczyna się w Indiach. Jeszcze godzinę później w Afryce i Europie. I nadal Boże Narodzenie w obu Amerykach dopiero kilka godzin później. Boże Narodzenie rozpoczynając w każdym jednym miejscu powinny być reprezentowaneZonedDateTime
. Boże Narodzenie wszędzie jest reprezentowane przezLocalDateTime
.Informacje o java.time
Struktura java.time jest wbudowana w Javę 8 i nowsze. Klasy te kłopotliwe zastąpić stary starszych klas Date-Time, takich jak
java.util.Date
,Calendar
, iSimpleDateFormat
.Projekt Joda-Time , obecnie w trybie konserwacji , zaleca migrację do klas java.time .
Aby dowiedzieć się więcej, zobacz samouczek Oracle . I przeszukaj Stack Overflow, aby znaleźć wiele 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 ma potrzeby stosowania ciągów ani
java.sql.*
klas.Skąd wziąć klasy java.time?
źródło
Lub użyj java.sql.Timestamp. Kalendarz jest ciężki, odradzałbym używanie go w kodzie produkcyjnym. Joda jest lepsza.
źródło
new Date()
tutaj. Ale w jaki sposób można łatwo uzyskać z niego oddzielne części, zgodnie z życzeniem?java.sql.Timestamp
został zastąpiony przezjava.time.Instant
JDBC 4.2.w java 7 Kalendarz jedna linia
źródło
Zapoznaj się z dokumentacją API dotyczącą klasy java.util.Calendar i jej pochodnych (być może szczególnie zainteresuje Cię klasa GregorianCalendar).
źródło
java.util.Date
,java.util.Calendar
ijava.text.SimpleDateFormat
są teraz starsze , zastępowane przez klasy java.time wbudowane w Javę 8 i nowsze. Zobacz samouczek firmy Oracle .Calendar now = new Calendar () // lub new GregorianCalendar () lub jakikolwiek inny smak, jakiego potrzebujesz
teraz.MIESIĄC teraz.GODZINA
itp.
źródło
MONTH
iHOUR
są stałymi statycznymiCalendar
, a nie właściwościami instancji.