2009-02-09 5 views
369

Ich versuche eine java.util.Date als Eingabe zu verwenden und dann eine Abfrage damit zu erstellen - also brauche ich eine java.sql.Date.Wie konvertiert man java.util.Date in java.sql.Date?

Ich war überrascht zu finden, dass es die Konvertierung nicht implizit oder explizit tun konnte - aber ich weiß nicht einmal, wie ich dies tun würde, da die Java API für mich noch ziemlich neu ist.

+0

Sie ein ähnliches Problem hier finden http://stackoverflow.com/questions/12131068/error-casting-java-util-date -into-java-sql-date – Lem

+0

Für mich stellte sich heraus, dass ich nicht konvertieren musste. Es gab einen 'import java.sql. *' In meinem Code, der die java.util.date überschrieb und somit Schwierigkeiten bei der Zuweisung von Datumswerten verursachte, die mit letzterem aber nicht dem ersten gut waren. HTH – HumanInDisguise

+1

@DavidAckerman Verstehst du, dass ein java.util.Date ein Datum * und * eine Tageszeit ist, aber ein java.sql.Date ist nur ein Datum * ohne * eine Uhrzeit? (Tatsächlich gibt es eine Tageszeit, aber das wird ignoriert, ein schlechter Hack eines Klassenentwurfs). In SQL bedeutet "DATUM" nur Datum. –

Antwort

26

tl; dr

  • Verwenden java.time Klassen statt Legacy java.util.Date & java.sql.Date mit JDBC 4.2 oder höher.
  • In/aus java.time konvertieren, wenn mit Code interagiert, der noch nicht auf java.time aktualisiert wurde.

Beispielabfrage mit .

myPreparedStatement.setObject( 
    … ,           // Specify the ordinal number of which argument in SQL statement. 
    myJavaUtilDate.toInstant()     // Convert from legacy class `java.util.Date` (a moment in UTC) to a modern `java.time.Instant` (a moment in UTC). 
     .atZone(ZoneId.of("Africa/Tunis")) // Adjust from UTC to a particular time zone, to determine a date. Instantiating a `ZonedDateTime`. 
     .toLocalDate()       // Extract a date-only `java.time.LocalDate` object from the date-time `ZonedDateTime` object. 
) 

Einzelheiten

Wenn Sie versuchen, mit Datum-Werte nur arbeiten (ohne Zeit-of-Tag, keine Zeitzone), verwenden Sie die LocalDate Klasse statt java.util.Date.

java.time

In Java 8 und später haben die lästigen alten Datum Zeitklassen gebündelt mit frühen Versionen von Java durch die neuen java.time package verdrängt worden. Siehe Oracle Tutorial. Ein großer Teil der Funktionalität wurde zurück auf Java 6 & 7 in ThreeTen-Backport und weiter an Android in ThreeTenABP angepasst.

A SQL data typeDATE ist nur für Datum gedacht, ohne Uhrzeit und ohne Zeitzone. Java hatte nie genau solch eine Klasse † bis java.time.LocalDate in Java 8. Erstellen wir einen solchen Wert, indem wir das heutige Datum einer bestimmten Zeitzone zuordnen (Zeitzone ist wichtig, um ein Datum zu bestimmen, da ein neuer Tag in Paris früher als in Montréal dämmert.) beispielsweise).

LocalDate todayLocalDate = LocalDate.now(ZoneId.of("America/Montreal")); // Use proper "continent/region" time zone names; never use 3-4 letter codes like "EST" or "IST". 

An diesem Punkt können wir fertig sein. Wenn Ihr JDBC driver mit JDBC 4.2 spec übereinstimmt, sollten Sie in der Lage sein, einen LocalDate über setObject auf einem PreparedStatement übergeben, um in einem SQL-DATE-Feld zu speichern.

myPreparedStatement.setObject(1 , localDate); 

Ebenso verwenden ResultSet::getObject aus einer SQL-DATE Spalte zu einem Java-Objekt LocalDate zu holen. Wenn Sie die Klasse im zweiten Argument angeben, wird Ihr Code type-safe.

LocalDate localDate = ResultSet.getObject(1 , LocalDate.class); 

Mit anderen Worten, diese ganze Frage ist unter JDBC 4.2 oder später irrelevant.

Wenn Ihr JDBC-Treiber auf diese Weise nicht funktioniert, müssen Sie auf die Konvertierung in die java.sql-Typen zurückgreifen.

zu java.sql.Date konvertieren

zu konvertieren, zu den alten Datum Zeitklassen haben neue Methoden. Wir können java.sql.Date.valueOf(…) anrufen, um eine LocalDate zu konvertieren.

java.sql.Date sqlDate = java.sql.Date.valueOf(todayLocalDate); 

Und die andere Richtung gehen.

LocalDate localDate = sqlDate.toLocalDate(); 

Konvertieren von java.util.Date

Während Sie die alten Datum-Zeit-Klassen vermeiden sollen, können Sie gezwungen werden, wenn sie mit bestehendem Code arbeiten. Wenn ja, können Sie nach java.time konvertieren.

Gehen Sie durch die Instant Klasse, die einen Moment auf der Timeline in UTC darstellt. Ein Instant ähnelt in der Idee einem java.util.Date. Beachten Sie jedoch, dass Instant eine Auflösung von bis zu nanoseconds hat, während java.util.Date nur milliseconds Auflösung hat.

Verwenden Sie zum Konvertieren neue Methoden, die zu den alten Klassen hinzugefügt wurden. Zum Beispiel java.util.Date.from(Instant) und java.util.Date::toInstant.

Um ein Datum zu bestimmen, benötigen wir den Kontext einer Zeitzone. Für jeden Moment variiert das Datum weltweit nach Zeitzone. Wenden Sie eine ZoneId an, um eine ZonedDateTime zu erhalten.

ZoneId zoneId = ZoneId.of ("America/Montreal"); 
ZonedDateTime zdt = ZonedDateTime.ofInstant (instant , zoneId); 
LocalDate localDate = zdt.toLocalDate(); 

† Die java.sql.Date Klasse gibt vor, ohne Zeit-of-day date-nur zu sein, aber tatsächlich tut ein Time-of-Tag, bis Mitternacht Zeit angepasst. Verwirrend? Ja, die alten Date-Time-Klassen sind ein Durcheinander.

421

Nevermind ....

public class MainClass { 

    public static void main(String[] args) { 
    java.util.Date utilDate = new java.util.Date(); 
    java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime()); 
    System.out.println("utilDate:" + utilDate); 
    System.out.println("sqlDate:" + sqlDate); 

    } 

} 

erklärt es. Der Link ist http://www.java2s.com/Tutorial/Java/0040__Data-Type/ConvertfromajavautilDateObjecttoajavasqlDateObject.htm

+33

Dies ist keine explizite Konvertierung! Aus dem Javadoc: "Wenn der angegebene Millisekunden-Wert Zeitinformationen enthält, setzt der Treiber die Zeitkomponenten auf die Zeit in der Standardzeitzone (die Zeitzone der Java Virtual Machine, auf der die Anwendung ausgeführt wird), die null GMT entspricht." Unabhängig von Ihrer Zeit in Ihrem java.util.Date wird es in einer Spalte mit dem Datentyp DATE als 00:00:00 eingefügt. –

+1

@David Ackerman ..... diese Methode gibt die 'epochseconds' zurück, d. H. Millisekunden nach' 1, JAN, 1970'. Aber was, wenn wir das Datum einer Person vor diesem Datum speichern möchten ... oder so etwas wie '1971 als Standard' –

+28

In meinem Fall ist die richtige Antwort java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(utilDate.getTime());, weil die Zeitfelder beibehalten werden. –

36

Mit der anderen Antwort, die Sie Probleme mit der Zeit info haben

Ich schlage vor (vergleiche die Daten mit unerwarteten Ergebnissen!):

java.util.Calendar cal = Calendar.getInstance(); 
java.util.Date utilDate = new java.util.Date(); // your util date 
cal.setTime(utilDate); 
cal.set(Calendar.HOUR_OF_DAY, 0); 
cal.set(Calendar.MINUTE, 0); 
cal.set(Calendar.SECOND, 0); 
cal.set(Calendar.MILLISECOND, 0);  
java.sql.Date sqlDate = new java.sql.Date(cal.getTime().getTime()); // your sql date 
System.out.println("utilDate:" + utilDate); 
System.out.println("sqlDate:" + sqlDate); 
+5

Wenn er java.sql.Date für eine Date-Spalte in einer Datenbank verwendet, wird diese Zeitinformation abgeschnitten. Sie haben die Lösung meiner Meinung nach überentwickelt. – darioo

+4

Ja, vielleicht habe ich es getan. Manchmal muss ich die java.sql.Data mit dem aktuellen Datum vergleichen und das ist der beste Weg. Ich hoffe, es kann helfen. – mauretto

-8

Wenn Sie Mysql sind usgin ein Datum Spalte kann eine String-Darstellung dieses Datums

übergeben, so dass ich die DateFormatter-Klasse zu formatieren und dann als String in der SQL-Anweisung oder vorbereitete Anweisung

hier ist der Code Illustration:

private String converUtilDateToSqlDate(java.util.Date utilDate) { 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
    String sqlDate = sdf.format(utilDate); 
    return sqlDate; 
} 

String date = converUtilDateToSqlDate (otherTransaction.getTransDate());

// dann dieses Datum in Ihr

zum Vergleichen 2 Termine (util.date oder sql.date)
+12

Willkommen bei stackoverflow, ich habe ein paar Kommentare zu Ihrer Antwort. Die Frage war, "wie man eine java.util.Date in java.sql.Date konvertiert". Der eingefügte Code formatiert ein java.util.Date als yyyy-MM-dd. Dies ist in diesem Zusammenhang von begrenztem Nutzen, da Sie java.sql.Date direkt an die jdbc-Treiber übergeben sollten, anstatt es als String zu verwenden. – jontro

1

Methode SQL-Anweisung übergibt

public static boolean isSameDay(Date a, Date b) { 
    Calendar calA = new GregorianCalendar(); 
    calA.setTime(a); 

    Calendar calB = new GregorianCalendar(); 
    calB.setTime(b); 

    final int yearA = calA.get(Calendar.YEAR); 
    final int monthA = calA.get(Calendar.MONTH); 
    final int dayA = calA.get(Calendar.DAY_OF_YEAR); 

    final int yearB = calB.get(Calendar.YEAR); 
    final int monthB = calB.get(Calendar.MONTH); 
    final int dayB = calB.get(Calendar.DAY_OF_YEAR); 

    return yearA == yearB && monthA == monthB && dayA == dayB; 
} 
2

Hier am Beispiel Util Date Sql Datum Umwandlung und ya das ist ein Beispiel, was ich in meinem Projekt verwende, könnte auch hilfreich für Sie sein.

java.util.Date utilStartDate = table_Login.getDob();(orwhat ever date your give form obj) 
java.sql.Date sqlStartDate = new java.sql.Date(utilStartDate.getTime());(converting date) 
0

versuchen mit diesem

public static String toMysqlDateStr(Date date) { 
    String dateForMySql = ""; 
    if (date == null) { 
     dateForMySql = null; 
    } else { 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
     dateForMySql = sdf.format(date); 
    } 

    return dateForMySql; 
} 
-3

i den folgenden Code verwende es bitte versuchen Sie es heraus

DateFormat fm= new SimpleDateFormatter(); 

das Format des Datums geben Sie zum Beispiel wollen "DD-MM_YYYY" oder 'YYYY-mm-dd' dann verwenden der Java Date Datentyp wie

fm.format("object of java.util.date"); 

dann wird es Ihr Datum

19

Diese Funktion gibt ein konvertierte SQL Datum von Java Date-Objekt analysieren.

public java.sql.Date convertJavaDateToSqlDate(java.util.Date date) { 
    return new java.sql.Date(date.getTime()); 
} 
5

Diese Funktion gibt ein konvertiertes SQL-Datum aus dem Java-Datumsobjekt zurück.

public static java.sql.Date convertFromJAVADateToSQLDate(
      java.util.Date javaDate) { 
     java.sql.Date sqlDate = null; 
     if (javaDate != null) { 
      sqlDate = new Date(javaDate.getTime()); 
     } 
     return sqlDate; 
    } 
-3

Sie diese Methode verwenden, können util Datum SQL-Datum,

DateUtilities.convertUtilDateToSql(java.util.Date) 
+0

Es gibt keine DateUtilities-Klasse in der Standard-Java-Bibliothek (und ich kann diese Methode überhaupt nicht durch eine schnelle Google-Suche finden). Wenn dies aus einer bestimmten Bibliothek stammt, möchten Sie vielleicht so viel sagen und einen Link zu den Dokumenten einfügen. – Dukeling

15

Converting java.util.Data zu java.sql.Data verloren die Stunde, Minute und Sekunde zu konvertieren. Also, wenn es möglich ist, empfehle ich Ihnen java.sql.Timestamp wie folgt verwenden:

prepareStatement.setTimestamp(1, new Timestamp(utilDate.getTime())); 

Für mehr Informationen, Sie this question überprüfen können.

3

Formatieren Sie zuerst Ihre java.util.Date. Verwenden Sie dann das formatierte Datum das Datum in java.sql.Date zu bekommen

java.util.Date utilDate = "Your date" 
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
final String stringDate= dateFormat.format(utilDate); 
final java.sql.Date sqlDate= java.sql.Date.valueOf(stringDate); 
-1

ich die beste Art und Weise denken zu konvertieren ist:

static java.sql.Timestamp SQLDateTime(Long utilDate) { 
    return new java.sql.Timestamp(utilDate); 
} 

Date date = new Date(); 
java.sql.Timestamp dt = SQLDateTime(date.getTime()); 

Wenn Sie die dt Variable in einer SQL-Tabelle einfügen möchten Sie können tun:

insert into table (expireAt) values ('"+dt+"'); 
+0

Dies scheint im Wesentlichen die gleiche wie [diese Antwort] (https://stackoverflow.com/a/31237429/1711796) ein Jahr zuvor veröffentlicht. – Dukeling

1

Ich bin ein Neuling: nach viel herum läuft dies funktioniert. Gedanke könnte nützlich sein

 String bufDt = bDOB.getText(); //data from form 
    DateFormat dF = new SimpleDateFormat("dd-MM-yyyy"); //data in form is in this format 
    Date bbdt = (Date)dF.parse(bufDt); // string data is converted into java util date 
    DateFormat dsF = new SimpleDateFormat("yyyy-MM-dd"); //converted date is reformatted for conversion to sql.date 
    String ndt = dsF.format(bbdt); // java util date is converted to compatible java sql date 
    java.sql.Date sqlDate= java.sql.Date.valueOf(ndt); // finally data from the form is convered to java sql. date for placing in database 
-3

Ich habe versucht, die folgende Codierung, die gut funktioniert.

java.util.Date utilDate = neu java.util.Date();
java.sql.Date sqlDate = neu java.sql.Date (utilDate);

7

In meinem Fall der Kommissionierung Datum von JXDatePicker (Java-Kalender) und bekommen es gespeichert in der Datenbank als SQL-Datum Typ, unten funktioniert gut ..

java.sql.Date date = new java.sql.Date(pickedDate.getDate().getTime());

wo pickedDate ist Gegenstand von JXDatePicker