Преобразование java.sql.Timestamp в мгновенное время
Из моей базы данных я получаю значение как:
20-DEC-17 10.15.53.000000000 AM
Я хочу выше java.sql.Timestamp
быть преобразованным в Мгновенное время как:
2017-12-20T10:15:53Z
Я пытался следовать с текущей отметкой времени
Timestamp ts2 = new Timestamp(date1.getTime());
Date tradeDate1=new Date(ts2.getTime());
Instant tradeInstant = tradeDate1.toInstant();
System.out.println("Tade Instant"+ tradeInstant);
- Фактическая отметка времени:
Fri Jun 22 16:07:35 IST 2018
- Что такое отпечатки в инстане:
Tade Instant2018-06-22T10:37:35.420Z
hours/mins/seconds
обновляются, что я не хочу - есть ли способ сохранить это как есть?
3 ответа
Я предполагаю, что вы используете по крайней мере Java 8 и по крайней мере JDBC 4.2. Кроме того, я предполагаю, что временная метка не имеет информации о часовом поясе или смещении в базе данных, но должна пониматься как временная метка в UTC (что является рекомендуемой практикой). В этом случае я бы посчитал самым безопасным явное добавление информации о смещении UTC в Java:
PreparedStatement yourPreparedStatement
= yourConnection.prepareStatement("select trade_timestamp from your_table");
ResultSet rs = yourPreparedStatement.executeQuery();
while (rs.next()) {
LocalDateTime tradeDateTime = rs.getObject(1, LocalDateTime.class);
Instant tradeInstant = tradeDateTime.atOffset(ZoneOffset.UTC).toInstant();
System.out.println("Trade Instant: " + tradeInstant);
}
Обратите внимание, что код избегает устаревших Timestamp
класс полностью. LocalDateTime
это дата и время суток без часового пояса или смещения. Если тип вашей базы данных был timestamp with timezone
Вы могли бы пройти Instant.class
в rs.getObject
и получили Instant
немедленно и не будет шляпа для преобразования. В зависимости от вашей базы данных и ее возможностей также возможно, что вы можете установить UTC в качестве смещения / часового пояса в сеансе базы данных, чтобы вы могли получить правильный момент таким же образом.
Что пошло не так в вашем коде?
Похоже, что ваш сеанс базы данных понимал метку времени как дату и время в вашем местном часовом поясе (IST, я предполагаю, что это стандартное время Индии (существуют другие интерпретации)). Согласно информативному комментарию Марка Роттвила, такое поведение требуется JDBC, но оно не согласуется с вашими потребностями, когда значение указано в UTC. Поэтому он дал вам неправильный момент времени, хотя выглядел правильно, когда вы печатали его. Само по себе обращение было правильным.
Основываясь на комментарии о неиспользовании SimpleDateFormat, я перешел к DateTimeFormatter:
Date today = new Date();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss") // same format
.withLocale(Locale.UK) // UK locale
.withZone(ZoneId.systemDefault());
String output = dateTimeFormatter.format( today.toInstant() );
System.out.println( output );
Бег дает вам:
2018-06-22T14:14:26
Я создал SimpleDateFormat, который печатает только "до секунд":
/* simple date format */
DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
/* get toInstant() and convert to date */
Date myDate = Date.from(today.toInstant());
/* myDate formatted using DATE_FORMAT */
String formattedDate = DATE_FORMAT.format(myDate);
System.out.println(formattedDate);