ТЛ; др
Используйте только современные классы 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 );
Форматированные строки
Используйте 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 Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, соответствующий JDBC 4.2 или более поздней версии . Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где взять классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь , такие как Interval
, YearWeek
, YearQuarter
, и более .