Jak uzyskać aktualny znacznik czasu w formacie ciągów w Javie? „Rrrr.MM.dd.HH.mm.ss”

174

Jak uzyskać znacznik czasu w formacie ciągu w Javie? „rrrr.MM.dd.HH.mm.ss”

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Timestamp());

To jest to, co mam, ale Timestamp () wymaga parametrów ...

user3388884
źródło
readyStatement.setTimestamp (1, new Timestamp (System.currentTimeMillis ()));
Rajat
Jaki błąd otrzymujesz?
Robert Columbia,
FYI, strasznie kłopotliwe stare klasy daty i czasu, takie jak SimpleDateFormati java.sql.Timestampsą teraz starsze , zastąpione przez klasy java.time wbudowane w Javę 8 i nowsze. Zobacz samouczek firmy Oracle .
Basil Bourque

Odpowiedzi:

202

Zastąpić

new Timestamp();

z

new java.util.Date()

ponieważ nie ma domyślnego konstruktora dla Timestamp, lub możesz to zrobić metodą:

new Timestamp(System.currentTimeMillis());
Jigar Joshi
źródło
5
FYI, strasznie kłopotliwe stare klasy daty i czasu, takie jak java.util.Datei java.sql.Timestampsą teraz starsze , zastąpione przez klasy java.time wbudowane w Javę 8 i nowsze. Zobacz samouczek firmy Oracle .
Basil Bourque
160

Użyj java.util.Dateclass zamiast Timestamp.

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());

W ten sposób otrzymasz aktualną datę w określonym formacie.

dimoniy
źródło
5
To mi pomogło i dokonałem kilku zmian, więc nie muszę importować new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date())
Pini Cheyni,
Lepiej new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").format(new Date());
Zon
36

tl; dr

Używaj tylko nowoczesnych klas java.time . Nigdy nie używaj straszne klas starszych, takich jak SimpleDateFormat, Datelub java.sql.Timestamp.

ZonedDateTime                    // Represent a moment as perceived in the wall-clock time used by the people of a particular region ( a time zone).
.now(                            // Capture the current moment.
    ZoneId.of( "Africa/Tunis" )  // Specify the time zone using proper Continent/Region name. Never use 3-4 character pseudo-zones such as PDT, EST, IST. 
)                                // Returns a `ZonedDateTime` object. 
.format(                         // Generate a `String` object containing text representing the value of our date-time object. 
    DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" )
)                                // Returns a `String`. 

Możesz też użyć bieżącej domyślnej strefy czasowej maszyny JVM .

ZonedDateTime
.now( ZoneId.systemDefault() )
.format( DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" ) )

java.time i JDBC 4.2

Nowoczesne podejście wykorzystuje klasy java.time , jak pokazano powyżej.

Jeśli Twój sterownik JDBC jest zgodny z JDBC 4.2 , możesz bezpośrednio wymieniać obiekty java.time z bazą danych. Użyj PreparedStatement::setObjecti ResultSet::getObject.

Używaj java.sql tylko dla sterowników starszych niż JDBC 4.2

Jeśli Twój sterownik JDBC nie jest jeszcze zgodny z JDBC 4.2 w zakresie obsługi typów java.time , musisz wrócić do używania klas java.sql.

Przechowywanie danych.

OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ;  // Capture the current moment in UTC.
myPreparedStatement.setObject(  , odt ) ;

Pobieranie danych.

OffsetDateTime odt = myResultSet.getObject(  , OffsetDateTime.class ) ;

Typy java.sql, takie jak java.sql.Timestamp, powinny być używane tylko do przesyłania do iz bazy danych. Natychmiast przekonwertuj na typy java.time w Javie 8 i nowszych.

java.time.Instant

Mapa java.sql.Timestampdo java.time.Instantchwili na osi czasu w UTC. Zwróć uwagę na nową metodę konwersji toInstantdodaną do starej klasy.

java.sql.Timestamp ts = myResultSet.getTimestamp(  );
Instant instant = ts.toInstant(); 

Strefa czasowa

Zastosuj żądaną / oczekiwaną strefę czasową ( ZoneId), aby uzyskać ZonedDateTime.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

Sformatowane ciągi

Użyj a, DateTimeFormatteraby wygenerować swój ciąg. Kody wzorców są podobne do tych z, java.text.SimpleDateFormatale nie do końca, więc przeczytaj uważnie dokumentację.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" );
String output = zdt.format( formatter );

Ten konkretny format jest niejednoznaczny co do jego dokładnego znaczenia, ponieważ nie ma żadnego wskazania przesunięcia względem UTC lub strefy czasowej.

ISO 8601

Jeśli masz coś do powiedzenia w tej sprawie, proponuję rozważyć użycie standardowych formatów ISO 8601 zamiast tworzyć własne. Standardowy format jest dość podobny do twojego. Na przykład:
2016-02-20T03:26:32+05:30.

Klasy java.time używają domyślnie tych standardowych formatów, więc nie ma potrzeby określania wzorca. ZonedDateTimeKlasa rozszerza standardowy format poprzez dołączenie nazwy strefy czasowej (mądry poprawę).

String output = zdt.toString(); // Example: 2007-12-03T10:15:30+01:00[Europe/Paris]

Konwertuj na java.sql

Możesz przekonwertować z java.time z powrotem na java.sql.Timestamp. Wyodrębnij plik Instantz ZonedDateTime.

Nowe metody zostały dodane do starych klas, aby ułatwić konwersję do / z klas java.time.

java.sql.Timestamp ts = java.sql.Timestamp.from( zdt.toInstant() );

Tabela typów daty i godziny w Javie (zarówno starszej, jak i nowoczesnej) oraz w standardowym języku SQL


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, i SimpleDateFormat.

Projekt Joda-Time , obecnie w trybie konserwacji , zaleca migrację do klas java.time .

Aby dowiedzieć się więcej, zobacz samouczek Oracle . Wyszukaj 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?

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 .

Basil Bourque
źródło
Więc jaki jest właściwy sposób uzyskania aktualnego znacznika czasu zegara ściennego w formacie „rrrr.MM.dd.HH.mm.ss”? Bez jawnego określenia na stałe zakodowanego ciągu mojej lokalnej strefy czasowej? O to pytał starter tematu, a nie mogłem znaleźć tego w twojej odpowiedzi ...
t7ko
@ t7ko Dodałem wiersz przykładowego kodu do sekcji tl; dr pokazujący, jak jawnie zapytać o bieżącą domyślną strefę czasową maszyny JVM. Wywołanie funkcji `now () 'bez żadnych argumentów robi to samo, ale nie jest jasne, czy zamierzałeś użyć wartości domyślnej, czy też nie znałeś lub zapomniałeś o kluczowej kwestii strefy czasowej.
Basil Bourque
32

Możesz skorzystać z java.util.Date zamiast Timestamp:

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());
Kakarot
źródło
6

Bardziej odpowiednim podejściem jest określenie regionu Locale jako parametru w konstruktorze. Poniższy przykład wykorzystuje region US Locale. Formatowanie daty jest wrażliwe na ustawienia regionalne i używa ustawień regionalnych w celu dostosowania informacji do zwyczajów i konwencji regionu użytkownika Ustawienia regionalne (Java Platform SE 7)

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss", Locale.US).format(new Date());
user3144836
źródło
1
Nie ma czegoś takiego jak „Locale Zone”. Podejrzewam, że są mylące Localei strefy czasowe, które nie są powiązane. Localekontroluje normy kulturowe dotyczące formatowania i ludzki język używany w nazwie miesiąca / dnia. Strefa czasowa dostosowuje reprezentację daty i godziny, aby była odpowiednia dla zegara ściennego w niektórych regionach . W przypadku tego pytania lokalizacja nie ma znaczenia, ponieważ nie ma problemów z formatowaniem, w przypadku których można by zastosować normy kulturowe, ani nazw miesiąca / dnia, które można by zlokalizować w jakimkolwiek ludzkim języku.
Basil Bourque
@BasilBourque Dziękujemy za Twój wkład. Zaktualizowałem odpowiedź, aby była bardziej wyraźna
user3144836
4

Możesz użyć następujących

new java.sql.Timestamp(System.currentTimeMillis()).getTime()

Result : 1539594988651

Mam nadzieję, że to pomoże. Tylko moja sugestia, a nie punkty nagrody.

Feniks
źródło
Nie ma żądanego formatu ciągu. Obawiam się też, że jedyne, co dodaje do kilku podobnych odpowiedzi, to niepotrzebne komplikacje…
Ole VV
4

Użyj nowoczesnych java.timeklas, jeśli używasz języka Java 8 lub nowszego.

String s = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());

Odpowiedź Basil Bourque jest całkiem dobra. Ale to za długo. Wiele osób nie miałoby cierpliwości, aby to przeczytać. Trzy najpopularniejsze odpowiedzi są zbyt stare i mogą wprowadzać w błąd nową pszczołę Java. Dlatego przedstawiam tę krótką i nowoczesną odpowiedź dla nowych programistów. Mam nadzieję, że ta odpowiedź może zmniejszyć użycie strasznych SimpleDateFormat.

gzc
źródło