Конвертировать метку времени из колонки db и Timezone в формат RF C 3999 - PullRequest
1 голос
/ 28 февраля 2020

Прежде чем я начну - я посмотрел эти ответы и не получил требуемого ответа:

Я сейчас читаю из базы данных 2 столбца:

  • create_at (временная метка, в которой был создан этот столбец - например, 2016-12-23 15:39:15)
  • timezone - часовой пояс временной метки (например - GMT+01:00).

I необходимо преобразовать эту информацию в RFC 3999 (например, - 2019-10-02 10:19:23-0800 представление времени. однако я не могу понять, как это сделать, поскольку из того, что я видел OffsetDateTime, ожидаем другой формат для часового пояса.

Другим вариантом может быть сделать это на уровне базы данных - но я так и не смог найти способ сделать это ...

РЕДАКТИРОВАТЬ:

Если у вас есть местное время и часовой пояс, вы можете использовать ZonedDateTime следующим образом:

final date = new LocalDateTime(...);
final String timezone = ...;
ZonedDateTime.of(date, ZoneOffset.of(zone));

Ответы [ 3 ]

1 голос
/ 28 февраля 2020
...
    ResultSet rs = ...;
    LocalDateTime createdAt = rs.getObject("created_at", LocalDateTime.class);
    String timezoneStr = rs.getString("timezone");

    String createdAtRfc3999 = convert(createdAt, timezoneStr);
...
}

private static final DateTimeFormatter IN_ZONE_OFFSET_FORMATTER = DateTimeFormatter.ofPattern("O");
private static final DateTimeFormatter RFC3999_DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ssZ");

public static String convert(LocalDateTime datetime, String strOffset) {
    ZoneOffset zoneOffset = IN_ZONE_OFFSET_FORMATTER.parse(strOffset, ZoneOffset::from);
    return datetime.atOffset(zoneOffset).format(RFC3999_DATE_TIME_FORMATTER);
}

Не должно быть проблем с получением created_at экземпляра LocalDateTime из базы данных через чистый JDB C или через JPA

1 голос
/ 28 февраля 2020

Возможно, вы ищете простой тип приведения:

SELECT CAST (
          CAST (
             '2016-12-23 15:39:15' || ' ' || 'GMT+01:00'
             AS timestamp with time zone
          )
          AS text
       );

          text          
------------------------
 2016-12-23 17:39:15+01
(1 row)
0 голосов
/ 23 марта 2020

Вы можете сделать это в SQL:

select to_char(created_at at time zone timezone, 'yyyy-mm-dd hh24:mi:ss TZH:TZM')
from the_table

Это предполагает, что timezone содержит действительное представление часового пояса, которое принимается Postgres.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...