java.time
Современный подход использует классы java.time, которые вытеснили унаследованные устаревшие классы даты и времени, входящие в состав самых ранних версий Java.
java.sql.Timestamp
Класс один из этих устаревших классов. Больше не нужен. Вместо этого используйте Instant
или другие классы java.time непосредственно с вашей базой данных, используя JDBC 4.2 и новее.
Instant
Класс представляет собой момент на временной шкале в формате UTC с разрешением наносекунд (до девяти (9) цифр десятичной дроби).
Instant instant = myResultSet.getObject( … , Instant.class ) ;
Если вам необходимо взаимодействовать с существующим Timestamp
, немедленно преобразуйте его в java.time с помощью новых методов преобразования, добавленных к старым классам.
Instant instant = myTimestamp.toInstant() ;
Чтобы перейти в другой часовой пояс, укажите часовой пояс как ZoneId
объект. Укажите правильное время имя зоны в формате continent/region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
. Никогда не используйте псевдозоны из 3-4 букв, такие как EST
или, IST
поскольку они не являются настоящими часовыми поясами, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
Примените к, Instant
чтобы создать ZonedDateTime
объект.
ZonedDateTime zdt = instant.atZone( z ) ;
Чтобы сгенерировать строку для отображения пользователю, выполните поиск по запросу Stack Overflow, DateTimeFormatter
чтобы найти множество обсуждений и примеров.
Ваш вопрос действительно о том, чтобы пойти в другом направлении, от ввода данных пользователя до объектов даты и времени. Как правило, лучше всего разбивать ввод данных на две части: дату и время суток.
LocalDate ld = LocalDate.parse( dateInput , DateTimeFormatter.ofPattern( "M/d/uuuu" , Locale.US ) ) ;
LocalTime lt = LocalTime.parse( timeInput , DateTimeFormatter.ofPattern( "H:m a" , Locale.US ) ) ;
Ваш вопрос непонятен. Вы хотите интерпретировать дату и время, введенные пользователем, как UTC? Или в другом часовом поясе?
Если вы имели в виду UTC, создать OffsetDateTime
со смещением , используя константу для UTC, ZoneOffset.UTC
.
OffsetDateTime odt = OffsetDateTime.of( ld , lt , ZoneOffset.UTC ) ;
Если вы имели в виду другой часовой пояс, объедините вместе с объектом часового пояса a ZoneId
. Но в каком часовом поясе? Вы можете определить часовой пояс по умолчанию. Или, если это критично, вы должны согласовать с пользователем, чтобы быть уверенным в его намерениях.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
Чтобы получить более простой объект, который по определению всегда находится в формате UTC, извлеките файл Instant
.
Instant instant = odt.toInstant() ;
…или…
Instant instant = zdt.toInstant() ;
Отправьте в вашу базу данных.
myPreparedStatement.setObject( … , instant ) ;
О java.time
Java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытеснять неприятные старые устаревшие классы даты и времени , такие как java.util.Date
, Calendar
, и SimpleDateFormat
.
Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial . И поищите в Stack Overflow множество примеров и объяснений. Спецификация - JSR 310 .
Где взять классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является испытательной площадкой для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь , такие как Interval
, YearWeek
, YearQuarter
, и более .