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ć
newTimestamp();
z
new java.util.Date()
ponieważ nie ma domyślnego konstruktora dla Timestamp, lub możesz to zrobić metodą:
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 .
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 .
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.
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ę).
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.
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 .
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:
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)
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.
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.
SimpleDateFormat
ijava.sql.Timestamp
są teraz starsze , zastąpione przez klasy java.time wbudowane w Javę 8 i nowsze. Zobacz samouczek firmy Oracle .Odpowiedzi:
Zastąpić
z
ponieważ nie ma domyślnego konstruktora dla
Timestamp
, lub możesz to zrobić metodą:źródło
java.util.Date
ijava.sql.Timestamp
są teraz starsze , zastąpione przez klasy java.time wbudowane w Javę 8 i nowsze. Zobacz samouczek firmy Oracle .Użyj
java.util.Date
class zamiast Timestamp.W ten sposób otrzymasz aktualną datę w określonym formacie.
źródło
new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date())
new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").format(new Date())
;tl; dr
Używaj tylko nowoczesnych klas java.time . Nigdy nie używaj straszne klas starszych, takich jak
SimpleDateFormat
,Date
lubjava.sql.Timestamp
.Możesz też użyć bieżącej domyślnej strefy czasowej maszyny JVM .
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::setObject
iResultSet::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.
Pobieranie danych.
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.Timestamp
dojava.time.Instant
chwili na osi czasu w UTC. Zwróć uwagę na nową metodę konwersjitoInstant
dodaną do starej klasy.Strefa czasowa
Zastosuj żądaną / oczekiwaną strefę czasową (
ZoneId
), aby uzyskaćZonedDateTime
.Sformatowane ciągi
Użyj a,
DateTimeFormatter
aby wygenerować swój ciąg. Kody wzorców są podobne do tych z,java.text.SimpleDateFormat
ale nie do końca, więc przeczytaj uważnie dokumentację.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.
ZonedDateTime
Klasa rozszerza standardowy format poprzez dołączenie nazwy strefy czasowej (mądry poprawę).Konwertuj na java.sql
Możesz przekonwertować z java.time z powrotem na
java.sql.Timestamp
. Wyodrębnij plikInstant
zZonedDateTime
.Nowe metody zostały dodane do starych klas, aby ułatwić konwersję do / z klas java.time.
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 . 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 .źródło
Możesz skorzystać z java.util.Date zamiast Timestamp:
źródło
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)
źródło
Locale
i strefy czasowe, które nie są powiązane.Locale
kontroluje 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.Możesz użyć następujących
Mam nadzieję, że to pomoże. Tylko moja sugestia, a nie punkty nagrody.
źródło
Użyj nowoczesnych
java.time
klas, jeśli używasz języka Java 8 lub nowszego.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
.źródło