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 . І шукайте в Stack Overflow багато прикладів та пояснень. Специфікація - JSR 310 .
Де отримати класи java.time?
Проект ThreeTen-Extra розширює java.time додатковими класами. Цей проект є полігоном для можливих майбутніх доповнень до java.time. Ви можете знайти деякі корисні класи тут , такі як Interval
, YearWeek
, YearQuarter
, і більш .