java.time
java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытесняют старые неприятные классы времени, такие как java.util.Date
, .Calendar
, & java.text.SimpleDateFormat
. Команда Joda-Time также рекомендует перейти на java.time.
Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений.
Большая часть функциональности java.time портирована на Java 6 & 7 в ThreeTen-Backport и далее адаптирована для Android в ThreeTenABP.
String input = "20160807000133";
DateTimeFormatter BASIC_ISO_DATETIME = DateTimeFormatter.ofPattern ("uuuuMMddHHmmss"); // Make constant somewhere in your codebase.
LocalDateTime ldt = LocalDateTime.parse (input , BASIC_ISO_DATETIME);
Дамп для консоли.
System.out.println ("input: " + input + " | ldt: " + ldt);
вход: 20160807000133 | LDT: 2016-08-07T00: 01: 33
Time Zone
Обратите внимание, что ваш ввод данные делают ошибку невключения какой-либо информации о часовом поясе или офсетный из-UTC. Таким образом, это не представляют момент на шкале времени. Если бы эти данные были предназначены для Парижа, это был бы другой момент, чем если бы это предназначалось для Монреаля.
Если вы знаете контекст, предназначенный для определенного часового пояса, примените ZoneId
перед использованием этого значения в запросе базы данных.
ZoneId zoneId = ZoneId.of ("America/Montreal");
ZonedDateTime zdt = ldt.atZone (zoneId);
НМВ: 2016-08-07T00: 01: 33-04: 00 [Америка/Монреаль]
Database
Если драйвер JDBC соответствует JDBC 4.2 или более поздней версии , вы должны иметь возможность напрямую передавать/извлекать типы java.time
через setObject
& getObject
.
Если нет, вернитесь к преобразованию с использованием новых методов, добавленных в старые классы. Для java.sql.Timestamp
это означает переход через Instant
, момент на шкале времени в UTC с разрешением до наносекунд. Мы можем извлечь объект Instant
из нашего ZonedDateTime
.
java.sql.Timestamp ts = java.sql.Timestamp.from(zdt.toInstant());
myPreparedStatement.setTimestamp(ts);
... и ...
java.sql.Timestamp ts = myResultSet.getTimestamp(1);
Instant instant = ts.toInstant();
ZoneId zoneId = ZoneId.of ("America/Montreal");
ZonedDateTime zdt = instant.atZone (zoneId);
Пожалуйста, пост кода, что вы пробовали до сих пор – Sanghita
Было бы проще сделать сравнение временных меток в самом запросе, не передавая переменное время даты от Java. Какая БД вы используете, а какие таблицы - таргетинг на ваши запросы? –