Jak przekonwertować Javę.util.Date to java.sql.Randka?

Próbuję użyć java.util.Date jako wejście, a następnie utworzenie z nim zapytania - więc potrzebuję java.sql.Date.

Byłem zaskoczony, że nie mógł wykonać konwersji w sposób dorozumiany lub jawny - ale nawet nie wiem, jak bym to zrobił, ponieważ Java API jest nadal dość nowy dla mnie.

Author: Basil Bourque, 2009-02-10

17 answers

Tl;dr

Jak przekonwertować Javę.util.Date to java.sql.Randka?

Obie klasy są przestarzałe.

  • użycie java.czas klasy zamiast Dziedzictwa java.util.Date & java.sql.Date z JDBC 4.2 lub nowszym.
  • Konwertuj do / Z Javy.czas pracy z kodem jeszcze nie zaktualizowanym do Javy.czas.

Przykładowe zapytanie z PreparedStatement.

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.
)

  • Instant zamiast java.util.Date
    oba reprezentują moment w UTC. ale teraz z nanosekundami zamiast milisekund.
  • LocalDate zamiast java.sql.Date
    obie reprezentują wartość tylko dla daty bez pory dnia i bez strefy czasowej.

Szczegóły

Jeśli próbujesz pracować z wartościami tylko daty( Bez godziny dnia, bez strefy czasowej), użyj LocalDate Klasa zamiast java.util.Date.

Java.czas

[46]}w Javie 8 i późniejszych, kłopotliwe stare klasy dat-time połączone z wczesnymi wersjami Javy zostały zastąpione przez nową {92]}Javę.pakiet czasowy . Zobacz Oracle Tutorial . Wiele funkcji zostało przeniesionych do Java 6 i 7 w ThreeTen-Backport i zaadaptowanych do Androida w ThreeTenABP {58]}.

A typ danych SQL DATE ma być tylko Data, bez pory dnia i Brak strefy czasowej. Java nigdy nie miała dokładnie takiej klasy, dopóki java.time.LocalDate w Javie 8. Stwórzmy taką wartość, otrzymując dzisiejszą datę zgodnie z określoną strefą czasową(Strefa czasowa jest ważna w określaniu daty, ponieważ nowy dzień świta wcześniej w Paryżu niż w Montréal, na przykład).

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".
W tym momencie możemy być skończeni. Jeśli twój sterownik JDBC jest zgodny z JDBC 4.2 spec, powinieneś być w stanie przekazać LocalDate przez setObject na PreparedStatement aby zapisać w polu daty SQL.
myPreparedStatement.setObject( 1 , localDate );

Podobnie, użyj ResultSet::getObject pobieranie z kolumny daty SQL do obiektu Java LocalDate. Podanie klasy w drugim argumencie sprawia, że kod jest bezpieczny dla typu .

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

Innymi słowy, to całe pytanie jest bez znaczenia w JDBC 4.2 lub później.

Jeśli twój sterownik JDBC nie działa w ten sposób, musisz wrócić do konwersji do Javy.sql typy.

Konwertuj na Javę.sql.Data

Aby przekonwertować, użyj nowych metod dodanych do starych klas daty i czasu. Możemy zadzwonić java.sql.Date.valueOf(…) do konwersji LocalDate.

java.sql.Date sqlDate = java.sql.Date.valueOf( todayLocalDate );
I w przeciwnym kierunku.
LocalDate localDate = sqlDate.toLocalDate();

Konwersja z java.util.Date

Chociaż powinieneś unikać używania starych klas date-time, możesz być do tego zmuszony podczas pracy z istniejącym kodem. Jeśli tak, możesz przekonwertować do / Z Javy.czas.

Przejść przez klasę Instant, która reprezentuje moment na osi czasu w UTC. An Instant jest podobne w idei do a java.util.Date. Ale zauważ, że Instant mA rozdzielczość do nanosekund , podczas gdy java.util.Datema tylko milisekund rozdzielczość.

Aby przekonwertować, użyj nowych metod dodanych do starych klas. Na przykład, java.util.Date.from( Instant ) oraz java.util.Date::toInstant.

Instant instant = myUtilDate.toInstant();

Aby określić datę, potrzebujemy kontekstu strefy czasowej. W danym momencie data zmienia się na całym świecie w zależności od strefy czasowej. Apply a ZoneId aby uzyskać ZonedDateTime.

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

† java.sql.Klasa date udaje datę-tylko bez pory dnia, ale w rzeczywistości robi porę dnia, dostosowaną do godziny północy. Mylące? Tak, stare zajęcia z randkami to bałagan.


O Javie.czas

The java.czas framework jest wbudowany w Java 8 i nowsze. Klasy te zastępują kłopotliwe stare dziedzictwo klasy date-time, takie jak java.util.Date, Calendar, & SimpleDateFormat.

The Joda-czas projekt, obecnie w trybie konserwacji , radzi migrację do java.czas klasy.

Aby dowiedzieć się więcej, Zobacz samouczek Oracle. I wyszukaj przepełnienie stosu dla wielu przykładów i wyjaśnień. Specyfikacja to JSR 310 .

Możesz wymienić Javę.obiekty time bezpośrednio z bazą danych. Użyj a JDBC driver zgodny z JDBC 4.2 lub nowszy. Nie ma potrzeby stosowania łańcuchów, nie ma potrzeby stosowania klas java.sql.*.

Skąd pobrać Javę.zajęcia czasowe?

The ThreeTen-Extra projekt rozszerza Javę.czas z dodatkowymi zajęciami. Ten projekt jest poligonem dla potencjalnych przyszłych dodatków do Javy.czas. Możesz znaleźć tutaj kilka przydatnych klas, takich jak Interval, YearWeek, YearQuarter, i więcej.

 40
Author: Basil Bourque,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-03 18:30:15

Nieważne....

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);

  }

}
To wyjaśnia. Link jest http://www.java2s.com/Tutorial/Java/0040__Data-Type/ConvertfromajavautilDateObjecttoajavasqlDateObject.htm
 444
Author: David Ackerman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-09 21:18:40

Z drugą odpowiedzią możesz mieć problemy z informacją o czasie (porównaj daty z nieoczekiwanymi wynikami!)

Proponuję:

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);
 38
Author: mauretto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-22 06:38:47

Ta funkcja zwróci przekonwertowaną datę SQL z obiektu java date.

public java.sql.Date convertJavaDateToSqlDate(java.util.Date date) {
    return new java.sql.Date(date.getTime());
}
 23
Author: chetan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-18 15:50:13

Konwersja java.util.Data na java.sql.Data spowoduje utratę godziny, minuty i sekundy. Jeśli jest to możliwe, proponuję użyć java.sql.Timestamp w ten sposób:

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

Aby uzyskać więcej informacji, możesz sprawdzić to pytanie .

 17
Author: shellbye,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:28

W moim przypadku wybierania daty Z jxdatepicker (java calender) i zapisywania jej w bazie danych jako Typu daty SQL, poniżej działa dobrze ..

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

Gdzie pickedDate jest obiektem jxdatepicker

 11
Author: jack jay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-09 14:20:33

Ta funkcja zwróci przekonwertowaną datę SQL z obiektu java date.

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;
    }
 5
Author: Tanmay kumar shaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-23 10:49:22

Sformatuj swoją Javę.util.Najpierw randka. Następnie użyj sformatowanej daty, aby uzyskać datę w języku java.sql.Data

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);
 3
Author: hackfield,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-16 14:58:54

Tutaj przykład konwersji daty Util na datę Sql i ya jest to jeden z przykładów, który używam w moim projekcie może być dla Ciebie pomocny.

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)
 2
Author: Krishna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-24 10:40:02

Jestem nowicjuszem: po wielu bieganiu to zadziałało. Thought might be useful

     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
 2
Author: PKSawmy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-27 08:15:24

Metoda porównywania 2 dat (util.Data lub sql.data)

 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;
}
 1
Author: Donovan Thomson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-14 08:38:34

Spróbuj z tym

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;
}
 0
Author: kapil das,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-04 12:48:20

Myślę, że najlepszym sposobem na konwersję jest:

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

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

Jeśli chcesz wstawić zmienną dt do tabeli SQL możesz zrobić:

insert into table (expireAt) values ('"+dt+"');
 -1
Author: user6043502,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-23 17:35:55

Używam poniższego kodu proszę go wypróbować

DateFormat fm= new SimpleDateFormatter();

Określ format daty, którą chcesz na przykład "DD-MM_YYYY" lub 'YYYY-mm-dd' Następnie użyj typu danych java Date jako

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

Następnie przetworzy datę

 -3
Author: UmeshA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-12 18:40:12

Możesz użyć tej metody, aby przekonwertować datę util na datę sql,

DateUtilities.convertUtilDateToSql(java.util.Date)
 -3
Author: Emmanuel Angelo.R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-02 05:58:04

Próbowałem następujące kodowanie, które działało dobrze.

Java.util.Date utilDate = new java.util.Date ();
java.sql.Data sqlDate = new java.sql.Date (utilDate);

 -4
Author: PONRAJ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-26 12:03:36

Jeśli używasz Mysql kolumny daty można przekazać reprezentację łańcuchową tej daty

Więc używam klasy DateFormatter do sformatowania go, a następnie ustawić go jako ciąg znaków w instrukcji sql lub prepared Instrukcja

Oto ilustracja kodu:

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 ());

/ / następnie podaj tę datę w poleceniu sql

 -8
Author: Benjamin Ndugga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-25 21:36:52