тл; д-р
Як конвертувати java.util.Date в java.sql.Date?
Не варто. Обидва класи застаріли.
- Використовуйте класи java.time замість застарілих
java.util.Date
та java.sql.Date
з JDBC 4.2 або новіших версій.
- Перетворити в / з java.time, якщо взаємодія з кодом ще не оновлено до java.time.
Приклад запиту з 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
замість java.util.Date
обох представляють момент у UTC. але тепер із наносекундами замість мілісекунд.
LocalDate
замість java.sql.Date
обох представляють значення лише для дати без часу доби та без часового поясу.
Деталі
Якщо ви намагаєтеся працювати зі значеннями, що відповідають лише даті (немає часу, немає часового поясу), LocalDate
скоріше використовуйте клас java.util.Date
.
java.time
У Java 8 та пізніших версіях тривожні старі класи дат у часі з ранніми версіями Java були замінені новим пакетом java.time . Дивіться навчальний посібник Oracle . Значна частина функцій була підпорядкована на Java 6 та 7 у ThreeTen-Backport та додатково адаптована до Android у ThreeTenABP .
Тип даних SQL DATE
призначається , щоб бути дата-тільки, без часу доби і без часового поясу. У Java ніколи не було саме такого класу † до java.time.LocalDate
Java 8. Давайте створимо таке значення, отримавши сьогоднішню дату відповідно до певного часового поясу (часовий пояс важливий для визначення дати як світанку нового дня раніше в Парижі, ніж у Монреалі, для приклад).
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".
На цьому момент ми можемо зробити це. Якщо ваш драйвер JDBC відповідає специфікації JDBC 4.2 , ви повинні мати змогу пройти LocalDate
вік setObject
на а PreparedStatement
для зберігання в поле DATE SQL.
myPreparedStatement.setObject( 1 , localDate );
Так само використовуйте ResultSet::getObject
для отримання зі стовпця SQL DATE до LocalDate
об’єкта Java . Визначення класу у другому аргументі робить ваш код безпечним для типу .
LocalDate localDate = ResultSet.getObject( 1 , LocalDate.class );
Іншими словами, ціле Питання не має значення відповідно до JDBC 4.2 або пізнішої версії.
Якщо ваш драйвер JDBC не працює таким чином, вам потрібно повернутися до переходу на типи java.sql.
Перетворити в java.sql.Date
Для перетворення використовуйте нові методи, додані до старих класів дати-часу. Ми можемо закликати java.sql.Date.valueOf(…)
перетворити LocalDate
.
java.sql.Date sqlDate = java.sql.Date.valueOf( todayLocalDate );
І йти іншим напрямком.
LocalDate localDate = sqlDate.toLocalDate();
Перетворення з java.util.Date
Незважаючи на те, що вам слід уникати використання старих класів дати-часу, вас можуть змусити працювати з існуючим кодом. Якщо так, ви можете конвертувати в / з java.time.
Пройдіть Instant
клас, який представляє момент на часовій шкалі в UTC. За Instant
ідеєю схожий на a java.util.Date
. Але зауважте, що Instant
вона має роздільну здатність до наносекунд, а роздільна здатність java.util.Date
- лише мілісекунд .
Для перетворення використовуйте нові методи, додані до старих класів. Наприклад, java.util.Date.from( Instant )
і java.util.Date::toInstant
.
Instant instant = myUtilDate.toInstant();
Щоб визначити дату, нам потрібен контекст часового поясу. Для будь-якого моменту дата змінюється по всьому світу за часовим поясом. Застосуйте а, ZoneId
щоб отримати ZonedDateTime
.
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
LocalDate localDate = zdt.toLocalDate();
† Клас java.sql.Date видає себе лише за датою без часу, але насправді має час дня, пристосований до півночі. Заплутано? Так, старі заняття з датою - це безлад.
Про java.time
Java.time каркас вбудований в Java 8 і пізніших версій. Ці класи витісняти неприємні старі застарілі класи дати і часу , такі як java.util.Date
, Calendar
, і SimpleDateFormat
.
Проект Joda-Time , який зараз знаходиться в режимі обслуговування , радить перейти до класів java.time .
Щоб дізнатися більше, дивіться навчальний посібник Oracle . І шукайте переповнення стека за багатьма прикладами та поясненнями. Специфікація - JSR 310 .
Ви можете обмінюватися об'єктами java.time безпосередньо зі своєю базою даних. Використовуйте драйвер JDBC, сумісний з JDBC 4.2 або пізнішої версії. Немає необхідності в струнах, немає потреби в java.sql.*
заняттях.
Де отримати класи java.time?
The ThreeTen-Extra розширює java.time додатковими класами. Цей проект є передумовою для можливих майбутніх доповнень до java.time. Ви можете знайти деякі корисні класи туттакі якInterval
,YearWeek
,YearQuarter
, і більш .