2008-12-05 8 views
6

Ich ziehe ein Datum und eine Uhrzeit aus einer Datenbank zurück. Sie werden in separaten Feldern gespeichert, aber ich möchte sie zu einem java.util.Date-Objekt kombinieren, das das Datum/die Zeit entsprechend wiedergibt.Wie kombiniere ich ein java.util.Date-Objekt mit einem java.sql.Time-Objekt?

Hier ist mein ursprünglicher Ansatz, aber es ist fehlerhaft. Ich habe immer ein Datum/eine Uhrzeit, die 6 Stunden vergehen, wie es sein sollte. Ich denke, das liegt daran, dass die Zeit einen Zeitzonen-Versatz hat und das Datum, und ich brauche wirklich nur einen von ihnen, um die Zeitzone zu versetzen.

Irgendwelche Vorschläge, wie dies zu tun ist, damit es mir das richtige Datum/Zeit gibt?

import java.sql.Time; 
import java.util.Calendar; 
import java.util.Date; 

import org.apache.commons.lang.time.DateUtils; 
    public static Date combineDateTime(Date date, Time time) 
     { 
      if (date == null) 
       return null; 
      Date newDate = DateUtils.truncate(date, Calendar.DATE); 
      if (time != null) 
      { 
       Date t = new Date(time.getTime()); 
       newDate = new Date(newDate.getTime() + t.getTime()); 
      } 
      return newDate; 
     } 

Antwort

10

Ich würde setzen sowohl das Datum und die Uhrzeit in Kalender-Objekte und dann die verschiedenen Kalender-Methoden verwenden, um die Zeitwerte aus dem zweiten Objekt zu extrahieren und sie in die erste Stelle setzen.

Calendar dCal = Calendar.getInstance(); 
    dCal.setTime(date); 
    Calendar tCal = Calendar.getInstance(); 
    tCal.setTime(time); 
    dCal.set(Calendar.HOUR_OF_DAY, tCal.get(Calendar.HOUR_OF_DAY)); 
    dCal.set(Calendar.MINUTE, tCal.get(Calendar.MINUTE)); 
    dCal.set(Calendar.SECOND, tCal.get(Calendar.SECOND)); 
    dCal.set(Calendar.MILLISECOND, tCal.get(Calendar.MILLISECOND)); 
    date = dCal.getTime(); 
+0

Calendar.getInstance() erzeugt eine neue Instanz des Kalenders. Der Kalender ist sehr schwer und nicht threadsicher. Obwohl dies technisch eine korrekte Vorgehensweise ist, gibt es viel bessere Möglichkeiten, dies zu tun. –

+2

Wenn es einen besseren Weg gibt, könnten Sie es bitte posten? – ScArcher2

+0

Nun, wenn Sie Bedenken haben, zu viele Kalender zu erstellen, können Sie eine für den Datumsteil und eine für die Zeit erstellen und sie nur mit dCal.setTime (date) und tCal.setTime (time) zurücksetzen; –

5

Verwenden Sie Joda Time anstelle von Javas eigenen Date-Klassen, wenn Sie diese Art von Dingen tun. Es ist eine weit überlegene Datum/Zeit-API, die die Art von Dingen, die Sie versuchen, extrem einfach und zuverlässig macht.

1

Angenommen, Sie kennen die Zeitzone der Uhrzeit, die aus der Datenbank gelesen wird, müssen Sie die ResultSet.getTime(String, Calendar) Methode verwenden, die zuvor die Zeitzone auf Calendar festgelegt hat. Der JDBC-Treiber nimmt die notwendigen Anpassungen an der Uhrzeit vor.

Wenn der gesamte Code serverseitig läuft, würde ich dringend empfehlen, die gemeinsame Zeitzone (wahrscheinlich UTC) für alle Zeiten zu standardisieren und gegebenenfalls das Rendering in der GUI zu konvertieren.

Ich würde auch JodaTime (http://joda-time.sourceforge.net) verwenden, es wird Ihnen Kopfschmerzen in der Zukunft sparen.

4

@Paul Tomblin ist eine sichere Möglichkeit, das TimeZone Problem zu kontrollieren, und ich wusste, jemand würde "Joda Time" in den Mix werfen. Die anderen Antworten sind alle gut und robuster als die folgende Hack:

Wenn Ihre Anwendung in dem gleichen TimeZone ausführt wie der Standard in der DB, könnten Sie in der Lage sein, um wegzukommen mit den folgende:

Wenn Sie diesen Schritt überspringen:

Date t = new Date(time.getTime()); 

und verwenden Sie den java.sql.Time Wert direkt, wie:

newDate = new Date(newDate.getTime() + time.getTime()); 

die Umstellung auf die Standard TimeZone wird nicht eingeführt - der java.sql.Time sollte den Wert wie gespeichert enthalten. jeder einzelne Anruf

YMMV, caveat emptor, etc ...

Verwandte Themen