簡體   English   中英

如何調整來自我的數據庫的時間戳?

[英]How to adjust a Timestamp that comes from my database?

在數據庫中,時間被保存為UTC時區(即0)的時間戳。 當我得到它時,我需要從我將發送的地方添加時區。 我有這兩條信息,但我找不到時間。

這是我從中獲取這兩個信息的代碼。 我嘗試轉換為LocalDateTime並調整區域,但沒有產生任何結果。 代碼不多:

Timestamp timestamp = resultQueryCamerasOffline.getLastOnline();
String zoneId = resultQueryCamerasOffline.getEmpresaTimezone();
System.out.println(timestamp.toString());
System.out.println(zoneId);

2020-03-12 03:01:45.0

美國/聖保羅

在數據庫中, last_online具有值:

2020-03-12 03:01:45.0

您可以並且可能必須使用LocalDateTime來實現您想要的,但最終產品應該是ZonedDateTime

基本上,時間戳應該被轉換到一個LocalDateTimeLocalDateTime然后可以轉化為ZonedDateTime通過添加特定ZoneId ,如下所示:

只需添加一個區域,保留日期時間:

public static void main(String[] args) {
    // get or take a timestamp
    java.sql.Timestamp timestamp = Timestamp.valueOf("2020-03-12 03:01:45.0");
    // transforming it into a LocalDateTime
    LocalDateTime localDateTime = timestamp.toLocalDateTime();
    // now create a ZonedDateTime by putting a zone
    ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime,
                                                    ZoneId.of("America/Sao_Paulo"));
    // and print the result
    System.out.println(zonedDateTime);
}

輸出是

2020-03-12T03:01:45-03:00[America/Sao_Paulo]

如果您確定運行此代碼的客戶端始終具有所需的時區,那么您也可以在創建ZonedDateTime時使用ZoneId.systemDefault()

但是如果你不只是想添加一個區域而是真的將Instant轉換為另一個區域,那么你可以這樣做:

Instant轉換為另一個時區:

public static void main(String[] args) {
    // get or take a timestamp
    java.sql.Timestamp timestamp = Timestamp.valueOf("2020-03-12 03:01:45.0");
    // transforming it into a LocalDateTime
    LocalDateTime localDateTime = timestamp.toLocalDateTime();
    // now create a ZonedDateTime by putting a zone
    ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(
            localDateTime.toInstant(ZoneOffset.of("+00:00")),
            ZoneId.of("America/Sao_Paulo"));
    // and print the result
    System.out.println(zonedDateTime);
}

這輸出

2020-03-12T00:01:45-03:00[America/Sao_Paulo]

你可以縮短第二個:

public static void main(String[] args) {
    // get or take a timestamp
    java.sql.Timestamp timestamp = Timestamp.valueOf("2020-03-12 03:01:45.0");
    // transforming it into a LocalDateTime
    ZonedDateTime utc = ZonedDateTime.of(timestamp.toLocalDateTime(), ZoneId.of("UTC"));
    // now create a ZonedDateTime by putting a zone
    ZonedDateTime saoPaulo = utc.withZoneSameInstant(ZoneId.of("America/Sao_Paulo"));
    // and print the result
    System.out.println(saoPaulo);
}

輸出保持

2020-03-12T00:01:45-03:00[America/Sao_Paulo]

如果您希望輸出格式不同,則必須選擇一種內置模式( DateTimeFormatter公共常量,如DateTimeFormatter.ISO_ZONED_DATE_TIME )或給它一個自定義DateTimeFormatter.ofPattern(String pattern) (通過DateTimeFormatter.ofPattern(String pattern)加上可選的Locale ):

public static void main(String[] args) {
    // get or take a timestamp
    java.sql.Timestamp timestamp = Timestamp.valueOf("2020-03-12 03:01:45.0");
    // transforming it into a LocalDateTime
    ZonedDateTime utc = ZonedDateTime.of(timestamp.toLocalDateTime(), ZoneId.of("UTC"));
    // now create a ZonedDateTime by putting a zone
    ZonedDateTime saoPaulo = utc.withZoneSameInstant(ZoneId.of("America/Sao_Paulo"));
    // create a formatter for your locale and with the desired pattern
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEEE dd MMM yyyy hh:mm:ss a xxx",
            Locale.forLanguageTag("pt-BR"));
    // and print the result
    System.out.println(saoPaulo.format(dtf));
}

這一次,輸出的格式完全不同:

Quinta-feira 12 mar 2020 12:01:45 AM -03:00

從您的時間戳中獲取毫秒並嘗試:

LocalDateTime date = LocalDateTime
.ofInstant(Instant.ofEpochMilli(timestamp.getTime()), ZoneId.systemDefault(yourTimezone()));

或嘗試使用ZonedDateTime

暫無
暫無

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

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