tl; dr
Используйте современные java.time классы.
Вот краткий, но бессмысленный пример перехода от текущего момента в часовом поясе к тексту вжелаемый формат без зоны / смещения, а затем снова вернитесь к моменту в часовом поясе.
LocalDateTime.parse( // Represent a date and time-of-day without a time zone or offset-from-UTC. **NOT* a moment, but represents potential moments along a range of about 26-27 hours.
ZonedDateTime.now( ZoneId.of( "Asia/Kuwait" ) ) // Represents a moment, a point on the timeline, a date and time-of-day with an assigned time zone.
.format( DateTimeFormatter.ofPattern( "dd-MMM-yyyy HH:mm:ss" , Locale.US ) ) // Generate a `String` with text representing the value of our `ZonedDateTime` object.
,
DateTimeFormatter.ofPattern( "dd-MMM-yyyy HH:mm:ss" , Locale.US ) // Specify `Locale` to determine the human language and cultural norms used in localizing such as parsing the name of the month.
) // Returns a `LocalDateTime` object.
.atZone( ZoneId.of( "Asia/Kuwait" ) ) // Assign a time zone to the `LocalDateTime` to determine a moment, to generate a `ZonedDateTime` object.
java.time
Вы используете ужасные старые классы даты и времени, которые были вытесненылет назад классами java.time .
Кроме того, я подозреваю, что вы имели в виду HH
для 24-часовых часов, а не строчные hh
для 12-часовых часов.
Сначала получите текущий момент.
ZoneId z = ZoneId.of( "Asia/Kuwait" ); // FYI, `Asia/Kuwait` is an alias of `Asia/Riyadh`.
ZonedDateTime zdt = ZonedDateTime.now( z );
zdt.toString (): 2018-09-27T22: 41: 45.314343 + 03: 00 [Азия / Кувейт]
Далее, сгенерируйте текст в желаемом формате, чтобы представить значение нашего ZonedDateTime
.Важно: обратите внимание, что ваш формат строки неполный , с долей секунды и отсутствующим индикатором часовой пояс или смещение от UTC .
Определение шаблона форматирования.Укажите Locale
, чтобы определить: - человеческий язык для перевода названия дня, названия месяца и т. Д.- культурные нормы , решающие вопросы аббревиатур, заглавных букв, пунктуации, разделителей и т. П.
Получите DateTimeFormatter
объект.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MMM-yyyy HH:mm:ss" , Locale.US );
Генерация текста.
String output = zdt.format( f );
27-Sep-2018 22: 41: 45
Возвращение в другом направлении сложнее, поскольку желаемый формат для этой строкиотсутствует какой-либо индикатор часового пояса или смещения от UTC.Такая строка не представляет момент.Взятые по номиналу, это может быть любой из множества потенциальных моментов в диапазоне 26-27 часов (диапазон часовых поясов вокруг земного шара).Я знаю, и вы знаете, что строка должна быть моментом в часовом поясе Asia/Kuwait
со смещением от UTC на три часа вперед.Но строка не буквально говорит это.
Таким образом, мы должны сначала проанализировать строку как LocalDateTime
, не имея зоны / смещения.
LocalDateTime ldt = LocalDateTime.parse( output , f );
ldt.toString (): 2018-09-27T22: 41: 45
Затем мы вводим предполагаемую зону, чтобы определить момент.
ZonedDateTime zdt2 = ldt.atZone( z );
zdt2.toString (): 2018-09-27T22: 41: 45 + 03: 00 [Азия / Кувейт]
Чтобы замкнуть круг, давайте сравним нашвторой ZonedDateTime
объект с первым.Чтобы справиться честно, мы должны обрезать долю секунды, опущенную в вашем желаемом текстовом формате.
boolean sameZdt = zdt.truncatedTo( ChronoUnit.SECONDS ).isEqual( zdt2 );
true
О java.time
Java.time framework встроен в 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?