Преобразование 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);
Другие вопросы по тегам