2013-08-15 13 views
30

Мне нужно добавить текущую дату в подготовленный оператор вызова JDBC. Мне нужно добавить дату в формате yyyy/MM/dd.Получить текущую дату в формате java.sql.Date

Я стараюсь с

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd"); 
Date date = new Date(); 
pstm.setDate(6, (java.sql.Date) date); 

, но у меня есть эта ошибка:

threw exception 
java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date 

Есть ли способ, чтобы получить java.sql.Date объект с тем же форматом?

+0

В зависимости от вашего прецедента вы можете не отправлять дату от клиента. Вместо этого у вас есть триггер insert в таблице, чтобы установить столбец «сейчас» на стороне сервера db. Таким образом, вы можете иметь согласованную временную метку на стороне сервера, защищать себя от проблем с часами/часовыми поясами на стороне клиента, а новые записи по-прежнему обновлять дату, если записи вставляются из другого клиентского приложения или транзакции addhoc. – Glenn

+0

благодарю вас за советы. – giozh

ответ

59

A java.util.Date не является java.sql.Date. Это наоборот. A java.sql.Date - java.util.Date.

Вам необходимо преобразовать его в java.sql.Date с помощью constructor that takes a long, который может предоставить java.util.Date.

java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime()); 
+0

Как насчет текущей даты? – Yster

+1

@Yster Вопрос уже имел текущую дату: 'Дата date = new Date();'.Речь идет о преобразовании 'java.util.Date' в' java.sql.Date'. – rgettman

+0

О, хорошо, я вижу спасибо. – Yster

23

Просто в одной строке:

java.sql.Date date = new java.sql.Date(Calendar.getInstance().getTime().getTime()); 
+1

Почему это дает мне всегда полночное время, а не текущее время? –

+2

на время вам нужно 'java.sql.Time time = new java.sql.Time (Calendar.getInstance(). GetTime(). GetTime());' –

11
new java.sql.Date(Calendar.getInstance().getTimeInMillis()); 
0

Вы можете достичь цели вам с ниже способов: -

long millis=System.currentTimeMillis(); 
java.sql.Date date=new java.sql.Date(millis); 

или

// create a java calendar instance 
Calendar calendar = Calendar.getInstance(); 

// get a java date (java.util.Date) from the Calendar instance. 
// this java date will represent the current date, or "now". 
java.util.Date currentDate = calendar.getTime(); 

// now, create a java.sql.Date from the java.util.Date 
java.sql.Date date = new java.sql.Date(currentDate.getTime()); 
0

Т.Л., д-р

myPreparedStatement.setObject(   // Directly exchange java.time objects with database without the troublesome old java.sql.* classes. 
    … ,         
    LocalDate.parse(      // Parse string as a `LocalDate` date-only value. 
     "2018-01-23".replace(" " , "T") // Alter input string to comply with standard ISO 8601 formatting. 
    ) 
) 

java.time

Современный подход использует java.time классы, которые вытесняют старые проблемные устаревшие классы, такие как java.util.Date и java.sql.Date.

Для значения даты используйте LocalDate. Класс LocalDate представляет собой значение только для даты без времени и без часового пояса.

Преобразуйте свою строку ввода в соответствие со стандартным форматированием ISO 8601. Замените SPACE посередине на T.

String input = "2018-01-23".replace(" " , "T") ; 

Классы java.time используют стандартные форматы при разборе/генерации строк. Поэтому нет необходимости указывать шаблон форматирования.

LocalDate ld = LocalDate.parse(input) ; 

Вы можете напрямую обмениваться java.time объектов с базой данных, используя JDBC driver совместимый с JDBC 4.2 или более поздней версии. Вы можете забыть о преобразовании в и из классов java.sql. *.

myPreparedStatement.setObject(… , ld) ; 

индексирование:

LocalDate ld = myResultSet.getObject(… , LocalDate.class) ; 

О java.time

java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time, в настоящее время в maintenance mode, советует перейти на классы java.time.

Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений. Спецификация: JSR 310.

Где получить классы java.time?

  • Java SE 8, Java SE 9, а затем
    • Встроенный.
    • Часть стандартного Java API с объединенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport.
  • Android
    • Более поздние версии Android реализаций пачке классов java.time.
    • Для более ранних Android, проект ThreeTenABP адаптируется ThreeTen-Backport (упомянутый выше). См. How to use ThreeTenABP….

ThreeTen-Extra Проект расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter и more.