2013-08-15 14 views
30

Potrzebuję dodać bieżącą datę do przygotowanego zestawienia połączenia JDBC. Muszę dodać datę w formacie takim jak yyyy/MM/dd.Pobierz aktualną datę w formacie java.sql.Date

mam spróbować z

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd"); 
Date date = new Date(); 
pstm.setDate(6, (java.sql.Date) date); 

ale mam ten błąd:

threw exception 
java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date 

Czy istnieje sposób, aby uzyskać java.sql.Date obiekt o takim samym formacie?

+0

W zależności od przypadku użycia możesz nie chcieć wysłać daty z klienta. Zamiast tego należy wstawić wyzwalacz w tabeli, aby ustawić kolumnę na "teraz" po stronie serwera bazy danych. W ten sposób można uzyskać spójny znacznik czasu po stronie serwera, chronić się przed problemami zegara/strefy czasowej po stronie klienta, a nowe rekordy mają nadal aktualizowaną datę, jeśli rekordy są wstawiane z innej aplikacji klienckiej lub transakcji addhoc. – Glenn

+0

również dziękuję za porady. – giozh

Odpowiedz

59

A java.util.Date nie jest java.sql.Date. Jest na odwrót. A java.sql.Date to java.util.Date.

Konieczne będzie przekonwertowanie go na java.sql.Date przy użyciu urządzenia constructor that takes a long, które może dostarczyć .

java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime()); 
+0

Co z aktualną datą? – Yster

+1

@Yster Pytanie ma już aktualną datę: 'Date date = new Date();'.Chodzi o konwersję 'java.util.Date' na' java.sql.Date'. – rgettman

+0

Oh OK, dziękuję. – Yster

23

Wystarczy w jednym wierszu:

java.sql.Date date = new java.sql.Date(Calendar.getInstance().getTime().getTime()); 
+1

dlaczego to daje mi zawsze północy, a nie czas? –

+2

na czas potrzebny jest 'java.sql.Time time = new java.sql.Time (Calendar.getInstance(). GetTime(). GetTime());' –

11
new java.sql.Date(Calendar.getInstance().getTimeInMillis()); 
0

można osiągnąć Ci cel z poniższych sposobów: -

long millis=System.currentTimeMillis(); 
java.sql.Date date=new java.sql.Date(millis); 

lub

// create a java calendar instance 
Calendar calendar = Calendar.getInstance(); 

// get a java date (java.util.Date) from the Calendar instance. 
// this java date will represent the current date, or "now". 
java.util.Date currentDate = calendar.getTime(); 

// now, create a java.sql.Date from the java.util.Date 
java.sql.Date date = new java.sql.Date(currentDate.getTime()); 
0

tl; dr

myPreparedStatement.setObject(   // Directly exchange java.time objects with database without the troublesome old java.sql.* classes. 
    … ,         
    LocalDate.parse(      // Parse string as a `LocalDate` date-only value. 
     "2018-01-23".replace(" " , "T") // Alter input string to comply with standard ISO 8601 formatting. 
    ) 
) 

java.time

Nowoczesne podejście wykorzystuje java.time klas, które zastąpić kłopotliwych starych klas starszych, takich jak java.util.Date i java.sql.Date.

Aby uzyskać wartość tylko dla daty, należy użyć LocalDate. Klasa LocalDate reprezentuje wartość tylko dla daty bez pory dnia i bez strefy czasowej.

Przekształć łańcuch wejściowy zgodnie ze standardowym formatowaniem ISO 8601. Wymień SPACE w środku na T.

String input = "2018-01-23".replace(" " , "T") ; 

Klasy java.time używają standardowych formatów podczas analizowania/generowania ciągów. Więc nie trzeba określać wzorca formatowania.

LocalDate ld = LocalDate.parse(input) ; 

Można bezpośrednio wymieniać java.time obiektów z bazy danych przy użyciu zgodnego z JDBC 4.2JDBC driver lub później. Możesz zapomnieć o przekształcaniu i usuwaniu klas java.sql. *.

myPreparedStatement.setObject(… , ld) ; 

pobierania:

LocalDate ld = myResultSet.getObject(… , LocalDate.class) ; 

O java.time

Ramy java.time jest wbudowana w Java 8 i późniejszych. Te klasy zastępują kłopotliwe stare klasy dat-czasu, takie jak java.util.Date, Calendar, & SimpleDateFormat.

Projekt Joda-Time, teraz w maintenance mode, zaleca migrację do klas java.time. Aby uzyskać więcej informacji, zobacz

. I wyszukaj Stack Overflow dla wielu przykładów i objaśnień. Specyfikacja to JSR 310.

Gdzie można uzyskać lekcje java.time?

  • Java SE 8, Java SE 9, a później
    • wbudowanej.
    • Część standardowego interfejsu API języka Java z pakietem implementacji.
    • Java 9 dodaje kilka drobnych funkcji i poprawek.
  • Java SE 6 i Java SE 7
    • Znaczna część funkcjonalności java.time jest back-przeniesiony do Java 6 & 7 w ThreeTen-Backport.
  • Android
    • Późniejsze wersje Androida wdrożeń wiązce klas java.time.
    • Dla wcześniejszego systemu Android projekt ThreeTenABP dostosowuje ThreeTen-Backport (wymieniony powyżej). Zobacz How to use ThreeTenABP….

Projekt ThreeTen-Extra rozciąga java.time z dodatkowych zajęć. Ten projekt jest poligonem wskazującym na możliwe przyszłe dodatki do java.time. Możesz znaleźć tutaj kilka użytecznych klas, takich jak Interval, YearWeek, YearQuarter i more.