簡體   English   中英

將時間戳從 db 和 Timezone 列轉換為 RFC 3999 格式

[英]Convert Timestamp from db and Timezone column into RFC 3999 format

在我開始之前 - 我已經查看了這些答案,但沒有得到所需的答案:

我目前從數據庫 2 列中讀取:

  • created_at(創建此列的時間戳 - 例如, 2016-12-23 15:39:15
  • timezone - 時間戳的時區(例如 - GMT+01:00 )。

我需要將此信息轉換為RFC 3999 (例如 - 2019-10-02 10:19:23-0800表示時間。但是,我無法弄清楚如何這樣做,因為從我所看到的OffsetDateTime期望時區的不同格式。

另一種選擇可能是在數據庫級別上執行此操作-但我也想不出一種方法來執行此操作...

編輯:

如果您同時擁有本地時間和時區,則可以使用ZonedDateTime如下:

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

您可能正在尋找一個簡單的類型轉換:

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)
...
    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);
}

無論是通過純 JDBC 還是通過 JPA 從數據庫中獲取created_at作為 LocalDateTime 實例都應該沒有問題

您可以在 SQL 中執行此操作:

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

這假設timezone包含 Postgres 接受的有效時區表示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM