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, і більш .