тл; д-р
Проект Joda-Time знаходиться в режимі обслуговування, тепер його витіснили класи java.time .
- Просто використовуйте
java.time.Instant
клас.
- Не потрібно:
LocalDateTime
java.sql.Timestamp
- Струни
Захоплення поточного моменту в UTC.
Instant.now()
Щоб зберегти цей момент у базі даних:
myPreparedStatement.setObject( … , Instant.now() ) // Writes an `Instant` to database.
Щоб отримати цей момент з дати бази даних:
myResultSet.getObject( … , Instant.class ) // Instantiates a `Instant`
Налаштування часу настінного годинника відповідно до певного часового поясу.
instant.atZone( z ) // Instantiates a `ZonedDateTime`
LocalDateTime
неправильний клас
Інші відповіді правильні, але вони не вказують, що LocalDateTime
це неправильний клас для вашої мети.
В обох java.time і Joda-Time , LocalDateTime
навмисно відсутня будь - яких концепція тимчасової зони або офсетні через UTC. Як такий, він не представляє моменту і не є точкою на часовій шкалі. А LocalDateTime
представляє приблизне уявлення про потенційні моменти протягом приблизно 26-27 годин.
Використовуйте LocalDateTime
або коли зона / зсув невідома (не дуже хороша ситуація), або коли зона зміщення невизначена. Наприклад, "Різдво починається в перший момент 25 грудня 2018 року" буде представлено у вигляді LocalDateTime
.
Використовуйте a, ZonedDateTime
щоб зобразити момент у певному часовому поясі. Наприклад, Різдво починається в будь-якій конкретній зоні, наприклад, Pacific/Auckland
або America/Montreal
буде зображено ZonedDateTime
предметом.
На мить завжди в UTC, використовуйте Instant
.
Instant instant = Instant.now() ; // Capture the current moment in UTC.
Застосовуйте часовий пояс. Той самий момент, та сама точка на часовій шкалі, але розглядається з іншим часом настінного годинника.
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ; // Same moment, different wall-clock time.
Отже, якщо я можу просто конвертувати між LocalDate та LocalDateTime,
Ні, неправильна стратегія. Якщо у вас є значення лише для дати та ви хочете значення дати, потрібно вказати час дня. Цей час дня може не бути дійсним у цю дату для певної зони - у цьому випадку ZonedDateTime
клас автоматично коригує час дня за потребою.
LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
LocalTime lt = LocalTime.of( 14 , 0 ) ; // 14:00 = 2 PM.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
Якщо ви хочете, щоб перша хвилина дня була вашим часом, дозвольте java.time визначити цей момент. Не припускайте, що день починається о 00:00:00. Такі аномалії, як літній час (DST), означають, що день може розпочатися в інший час, наприклад, 01:00.
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
java.sql.Timestamp
неправильний клас
Це java.sql.Timestamp
частина проблемних старих класів дати, які тепер перейшли у спадщину, повністю витіснені класами java.time . Цей клас використовувався для відображення моменту в UTC з роздільною здатністю наносекунд . Цій цілі зараз слугує java.time.Instant
.
JDBC 4.2 з getObject
/setObject
Станом на JDBC 4.2 і пізніші версії, ваш драйвер JDBC може безпосередньо обмінюватися об’єктами java.time з базою даних, зателефонувавши:
Наприклад:
myPreparedStatement.setObject( … , instant ) ;
… І…
Instant instant = myResultSet.getObject( … , Instant.class ) ;
Перетворити спадщину ⬌ сучасне
Якщо ви маєте інтерфейс зі старим кодом, ще не оновленим до java.time , конвертуйте туди і назад нові методи, додані до старих класів.
Instant instant = myJavaSqlTimestamp.toInstant() ; // Going from legacy class to modern class.
… І…
java.sql.Timestamp myJavaSqlTimestamp = java.sql.Timestamp.from( instant ) ; // Going from modern class to legacy class.
Про 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?
Проект ThreeTen-Extra розширює java.time додатковими класами. Цей проект є доказом можливих майбутніх доповнень до java.time. Ви можете знайти деякі корисні класи тут , такі як Interval
, YearWeek
, YearQuarter
, і більш .
java.sql.Timestamp
клас тепер застарілий, витіснений класами java.time , зокрема користувачемInstant
.