2013-09-25 25 views
11

Ich habe eine LocalDate, die ich in eine java.sql.Date konvertieren möchte, um es in einem Date-Feld in der DB zu speichern. Mein Problem ist, dass, wenn ich es zu einem java.sql.Date umwandle, es ein Tag hinter ist, wegen der Maschine, auf der ich läuft, in EST zu sein. Ich habe Joda.DateTime in UTC eingerichtet und die java.sql.Date über den Millis-Konstruktor erstellt. Ich bin auch die Ausgabe des Debug-Uhren so können Sie sehen, was die verschiedenen Werte sind:Was ist der richtige Weg von LocalDate zu java.sql.Date gehen

item.getDate().toDateTimeAtStartOfDay() = {[email protected]}"2013-09-25T00:00:00.000Z" 
item.getDate().toDateTimeAtStartOfDay().getMillis() = 1380067200000 
new java.sql.Date(item.getDate().toDateTimeAtStartOfDay().getMillis()) = {[email protected]}"2013-09-24" 
item.getDate().getLocalMillis() = 1380067200000 
new java.sql.Date(item.getDate().getLocalMillis()) = {[email protected]}"2013-09-24" 
new java.util.Date(item.getDate().getLocalMillis()) = {[email protected]}"Tue Sep 24 20:00:00 EDT 2013" 

Von der java.util.Date Schöpfung Ich nehme an, es liegt daran, dass meine Maschine teste ich auf in EST ist, und Das LocalDate ist in UTC, aber ich bin mir nicht sicher, was der richtige Weg ist, um das zu beheben. Mir ist klar, dass ich die lokale Zeitzone bekommen und das zu den Millis hinzufügen kann, aber das scheint wie ein Hacky-Fix ​​zu sein. Gibt es einen richtigen Weg, dies zu tun, den ich gerade vermisse?


-Update mit dem millis für die java.util.Date

new java.util.Date(item.getDate().getLocalMillis()).getTime() = 1380153600000 
item.getDate().toDateTimeAtStartOfDay().getMillis() = 1380153600000 
item.getDate() = {[email protected]}"2013-09-26" 
new java.sql.Date(item.getDate().getLocalMillis()).getTime() = 1380153600000 
new java.util.Date(item.getDate().getLocalMillis()) = {[email protected]}"Wed Sep 25 20:00:00 EDT 2013" 
new java.util.Date(item.getDate().getLocalMillis()).getTime() = 1380153600000 
+0

Was ist der Wert in Millisekunden des SQL- und util 'Date' Objekte? –

Antwort

7

Die richtigen Umwandlungen sind:

public static final DateTimeZone jodaTzUTC = DateTimeZone.forID("UTC"); 

    // from java.sql.Date to LocalDate: 
    public static LocalDate dateToLocalDate(java.sql.Date d) { 
     if(d==null) return null; 
     return new LocalDate(d.getTime(), jodaTzUTC); 
    } 

    // from LocalDate to java.sql.Date: 
    public static java.sql.Date localdateToDate(LocalDate ld) { 
     if(ld==null) return null; 
     return new java.sql.Date(
      ld.toDateTimeAtStartOfDay(jodaTzUTC).getMillis()); 
    } 

ich diese verwenden in der Logik meiner DAO Helfers . In JDBC sollten Sie tun

public static final Calendar calendarUTC = Calendar.getInstance(
     TimeZone.getTimeZone("UTC")); 

d = rs.getDate(i, calendarUTC); 

Und das gleiche für den Setter.

-2

sollten Sie erstellen und verwenden ein java.sql.Timestamp, kein java.sql.Date. Nach Spezifikation hat die java.sql.Date kein Zeitelement.

Um LOCALDATE zu zu konvertieren:

Timestamp timestamp = new Timestamp(localDate.toDateMidnight().getMillis()); 

Um Local zeitzustempeln zu konvertieren:

Timestamp timestamp = new Timestamp(localDateTime.toDateTime().getMillis()); 
+2

Ich brauche keinen Zeitstempel Ich brauche ein Datum, ich speichere ein Datum in der Datenbank. – Zipper

+0

LocalDate hat auch kein Zeitelement, genau wie java.sql.Date – Tristan

3

Lassen Sie uns haben Sie joda lokalen Datum

LocalDate loc = //... 

Sie es java.sql.Date mit Unabhängigkeit der Zone conver kann, in der nächsten Möglichkeiten:

Date date = new Date(loc .getYear() - 1900, loc .getMonthOfYear() - 1, loc .getDayOfMonth()); 

oder

Date date = Date.valueOf(l.toString()); 
+0

Dieser Konstruktor ist veraltet –

0

Wenn Sie gefunden Diese Frage durch die Suche, wie zu konvertieren Java 8 L ocalDate, hier ist, wie Sie es tun:

public static Datum valueOf (LOCALDATE Datum)

Ermittelt eine Instanz von Datum von einem LOCALDATE Objekt mit dem gleichen Jahr, Monat und Tag des Monats Wert als die gegeben LocalDate. Das zur Verfügung gestellte LocalDatewird als lokales Datum in der lokalen Zeitzone interpretiert. Parameter: date - ein LocalDate für convertReturns: ein Datum objectThrows: NullPointerException - wenn date nullSince ist: 1.8

Beispiel:

Date sqlDate = Date.valueOf(localDateObject); 
+2

Dies verwirrt Joda LocalDate mit Java 8 LocalDate. Die Frage bezieht sich auf Joda LocalDate. – oulenz

+1

@oulenz Sie haben Recht. Ich habe einen Schnitt gemacht, um darauf hinzuweisen. – Tomasz

Verwandte Themen