簡體   English   中英

將 java.sql.TimeStamp 更改為 Java 中的 UTC 格式的最佳方法

[英]Best way to Change java.sql.TimeStamp to UTC format in Java

我已經嘗試了多種方法,其中一種是使用 SimpleDateFromatter,現在正在嘗試

import java.sql.Timestamp;
public static String getCorrectTimeFormat(Timestamp time) {
        return time.toInstant().toString();
    }

但問題是我在編寫單元測試時意識到,時間被修改了。

  Timestamp timeStamp = Timestamp.valueOf("2020-07-22 12:26:51.599");
  String res = UserUtil.getCorrectTimeFormat(timeStamp);
  assertThat(res).isEqualTo("2020-07-22T12:26:51.599Z");

這永遠不會過去,因為它會自動轉換為“2020-07-22T11:26:51.599Z”

  1. 最好完全避免jqva.sql.Timestamp 我會告訴你怎么做。
  2. 你得到的結果是正確的,我想你已經發現了。

從您的數據庫中獲取 java.time 類型

由於 JDBC 4.2 我們可以直接從ResultSet獲取 java.time 類型。 如果您的數據庫值是timestamp with time zone (推薦),例如:

    OffsetDateTime odt = rs.getObject(
            "your_timestamp_with_time_zone_column", OffsetDateTime.class);
    String utcString = odt.withOffsetSameInstant(ZoneOffset.UTC).toString();

如果您的數據庫值是沒有時區的timestamp (不推薦),我們只能從中獲取一個LocalDateTime ,它沒有定義時間點。 要轉換為Instant ,我們需要知道數據庫使用哪個時區。 例如:

    ZoneId datebaseTimeZone = ZoneId.of("Europe/Paris");
    LocalDateTime ldt = rs.getObject(
            "your_timestamp_column", LocalDateTime.class);
    String utcString = ldt.atZone(datebaseTimeZone)
            .withZoneSameInstant(ZoneOffset.UTC)
            .toString();

如果您的數據庫使用 UTC,它算作偏移量,那么使用ZoneOffset比使用ZoneId更好:

    ZoneOffset datebaseOffset = ZoneOffset.UTC;
    LocalDateTime ldt = rs.getObject(
            "your_timestamp_column", LocalDateTime.class);
    String utcString = ldt.atOffset(datebaseOffset).toString();

你觀察到的結果是正確的

java.sql.Timestamp在 JVM 的默認時區中令人困惑地打印,並且Timestamp.valueOf()同樣令人困惑地假設該時區因此,假設您的時區在一年中的這個時候位於偏移 +01:00(例如英國、愛爾蘭、葡萄牙、摩洛哥和突尼斯),則從2020-07-22 12:26:51.5992020-07-22T11:26:51.599Z是正確的。

您可以使用 java 8 個時間 ZonedDateTime class:

//1 - default pattern
String timeStamp = "2019-03-27T10:15:30";
ZonedDateTime localTimeObj = ZonedDateTime.parse(time);

//2 - specified pattern
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss a z");
String timeStamp1 = "2019-03-27 10:15:30 AM";
ZonedDateTime localTimeObj1 = ZonedDateTime.parse(timeStamp1, formatter);

//To get LocalDate from ZonedDateTime
LocalDate localDate = localTimeObj1.toLocalDate()

//To get timestamp from zoneddatetime with utc timezone
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneOffset.UTC);
Timestamp timestamp = Timestamp.from(ZonedDateTime.now(ZoneOffset.UTC).toInstant());

暫無
暫無

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

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