тл; д-р
Використовуйте лише сучасні класи java.time . Ніколи не використовуйте жахливі застарілі класи , такі як SimpleDateFormat
, Date
або java.sql.Timestamp
.
ZonedDateTime // Represent a moment as perceived in the wall-clock time used by the people of a particular region ( a time zone).
.now( // Capture the current moment.
ZoneId.of( "Africa/Tunis" ) // Specify the time zone using proper Continent/Region name. Never use 3-4 character pseudo-zones such as PDT, EST, IST.
) // Returns a `ZonedDateTime` object.
.format( // Generate a `String` object containing text representing the value of our date-time object.
DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" )
) // Returns a `String`.
Або скористайтеся поточним часовим поясом за замовчуванням JVM .
ZonedDateTime
.now( ZoneId.systemDefault() )
.format( DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" ) )
java.time та JDBC 4.2
Сучасний підхід використовує класи java.time, як видно вище.
Якщо ваш драйвер JDBC відповідає JDBC 4.2 , ви можете безпосередньо обмінюватися об’єктами java.time з базою даних. Використовуйте PreparedStatement::setObject
і ResultSet::getObject
.
Використовуйте java.sql лише для драйверів до JDBC 4.2
Якщо ваш драйвер JDBC ще не відповідає JDBC 4.2 для підтримки типів java.time , ви повинні повернутися до використання класів java.sql.
Зберігання даних.
OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ; // Capture the current moment in UTC.
myPreparedStatement.setObject( … , odt ) ;
Отримання даних.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
Такі типи java.sql, як, наприклад java.sql.Timestamp
, слід використовувати лише для передачі в базу даних та поза нею. Негайно перетворити на типи java.time в Java 8 та новіших версіях.
java.time.Instant
java.sql.Timestamp
Карти до java.time.Instant
, момент на шкалі часу в форматі UTC. Зверніть увагу на новий метод перетворення, toInstant
доданий до старого класу.
java.sql.Timestamp ts = myResultSet.getTimestamp( … );
Instant instant = ts.toInstant();
Часовий пояс
Застосуйте потрібний / очікуваний часовий пояс ( ZoneId
), щоб отримати а ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
Форматизовані рядки
Використовуйте a DateTimeFormatter
для створення вашого рядка. Коди шаблонів схожі на ті, java.text.SimpleDateFormat
але не зовсім, тому уважно читайте документ.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" );
String output = zdt.format( formatter );
Цей конкретний формат неоднозначний щодо його точного значення, оскільки у ньому відсутні будь-які вказівки на зміщення з-за UTC або часового поясу.
ISO 8601
Якщо ви маєте щось з цього приводу, пропоную вам скористатися стандартними форматами ISO 8601 , а не прокручувати свій власний. Стандартний формат досить схожий на ваш. Наприклад:
2016-02-20T03:26:32+05:30
.
Класи java.time використовують стандартні формати за замовчуванням, тому не потрібно вказувати шаблон. ZonedDateTime
Клас розширює стандартний формат шляхом додавання імені тимчасової зони (мудра поліпшення).
String output = zdt.toString(); // Example: 2007-12-03T10:15:30+01:00[Europe/Paris]
Перетворити на java.sql
Ви можете конвертувати з java.time назад в java.sql.Timestamp
. Витяг Instant
з ZonedDateTime
.
До старих класів додано нові методи для полегшення перетворення в / з класів java.time.
java.sql.Timestamp ts = java.sql.Timestamp.from( zdt.toInstant() );
Про 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
, і більш .