2009-05-06 2 views
7

Was ich tun muss, ist:Java/Servlet: erhalten aktuelle sql.Date

1) Holen Sie sich Benutzer Gebietsschema aus Anfrage.

2) Erstellen Sie neue sql.Date Objekt mit dem aktuellen Datum und Zeit, basierend auf Benutzer-locale

3) Schreiben Sie es in MySQL db, Spaltentyp: TIMESTAMP

Was ich habe ist:

java.util.Locale locale = request.getLocale(); 

java.text.DateFormat dateFormat = 
java.text.DateFormat.getDateTimeInstance(
         java.text.DateFormat.LONG, java.text.DateFormat.LONG, locale); 

java.util.Date date = new java.util.Date(); 

java.sql.Date sqlDate = new java.sql.Date(date.getTime()); 

Datum ist OK, aber haben ein Problem mit der Zeit - immer 12:00:00.

Irgendwelche Vorschläge? Gibt es einen effizienteren Weg, dies zu tun?

Antwort

4

Wenn Sie die Zeit möchten, benötigen Sie eine java.sql.Timestamp nicht eine java.sql.Date und eine Zeitmarke Spalte in der Datenbank.

+0

Genau. Danke für einen Hinweis! – Artemij

+0

Danke. Dies ist, was ich gesucht habe :) –

0

Beachten Sie, dass request.getLocale den Wert der Accept-Language-Überschrift verwendet und möglicherweise nicht immer das richtige Gebietsschema angibt.

+0

Ich werde es im Hinterkopf behalten. Vielen Dank. – Artemij

0

Das Abrufen der Zeitzone basierend auf dem Gebietsschema ist möglicherweise nicht ihre tatsächliche Zeitzone.

Ein Beispiel: Hier in Australien ist das Gebietsschema "en-AU", aber wir haben ein paar Zeitzonen mit bis zu 3 Stunden Unterschied.

Ich würde vermuten, in den USA haben sie dieses Problem auch.

Eine mögliche Lösung ist speichern UTC Zeit statt. Wenn der Benutzer dann seine Zeitzone zum Beispiel in seinen Vorlieben einstellt oder eine andere Methode zum Übergeben der Zeitzone verwendet (Client/Browser-Information über AJAX), dann können Sie die UTC-Zeit basierend auf einer java.util.Calendar Instanz anpassen.

+0

Vielen Dank für diesen wichtigen Hinweis. Können Sie ein Beispiel für eine elegante Lösung vorschlagen? – Artemij

9

Es gibt eine weitere einfache Lösung dafür. Verwendung dieses Code mit aktuellem Datum java.util.Date

java.util.Calendar cal = java.util.Calendar.getInstance(); 
java.util.Date utilDate = cal.getTime(); 
java.sql.Date sqlDate = new Date(utilDate.getTime()); 
+1

Eine kompaktere Lösung ist: 'java.util.Calendar cal = java.util.Calendar.getInstance();' 'java.sql.Date timeNow = neues Datum (cal.getTimeInMillis());' – Ryan

17

Auch eine kompaktere Lösung zu erhalten;)

java.sql.Date timeNow = new Date(Calendar.getInstance().getTimeInMillis());