我正在使用 JavaInstant獲取當前的日期時間資訊,但它回傳給我的 UTC Datetime withZ或 with [Europe/Berlin]。如何獲取Datetime具有時區偏移的唯一資訊?
以下是我的代碼:
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Test {
public static void main(String[] args) {
Instant instant = Instant.now();
System.out.println("Current Time : " instant);
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
System.out.println("LocalDateTime : " localDateTime);
ZonedDateTime zonedDateTime1 = ZonedDateTime.ofInstant(instant, ZoneId.systemDefault());
System.out.println("ZonedDateTime1: " zonedDateTime1);
}
}
以下是我的輸出:
Current Time : 2022-04-13T08:22:35.362644Z
LocalDateTime : 2022-04-13T10:22:35.362644
ZonedDateTime1: 2022-04-13T10:22:35.362644 02:00[Europe/Berlin]
我的預期輸出是:
expected output: 2022-04-13T10:22:35.362644 02:00
我怎樣才能得到我的預期輸出2022-04-13T10:22:35.362644 02:00使用Instant?我知道我可以執行 substring(),但我不想這樣做。我正在尋找一些直接的方法來實作這一目標。請提供一些建議。
另外,我不希望傳遞區域資訊,因為可以跨多個區域訪問應用程式,因此不希望在代碼中對區域進行硬編碼。
uj5u.com熱心網友回復:
tl;博士
如何獲取具有時區偏移的唯一日期時間資訊?
OffsetDateTime
.now()
.toString()
2022-04-13T22:47:58.123793 02:00
或者,明確說明您想要/預期的時區,而不是隱式依賴 JVM 當前的默認時區。
OffsetDateTime
.now(
ZoneId.of( "Europe/Berlin" )
)
.toString()
OffsetDateTime
您詢問:
如何獲取具有時區偏移的唯一日期時間資訊?
要表示一個日期,如從 UTC 子午線的一些小時-分鐘-秒的偏移量中看到的那樣,請使用OffsetDateTime該類。
呼叫OffsetDateTime.now()隱式應用 JVM當前默認時區的偏移量。
OffsetDateTime odt = OffsetDateTime.now() ; // Uses current offset.
查看在 IdeOne.com 上實時運行的代碼。
2022-04-13T20:47:58.059193Z
最后Z的意思是與UTC的偏移量為零,發音為“Zulu”。
IdeOne.com 網站恰好使用 UTC 本身的默認時區,也就是“祖魯時間”。因此,讓我們指定一個時區以查看不同的偏移量。
OffsetDateTime odt2 = OffsetDateTime.now( ZoneId.of( "Europe/Berlin" ) ) ; // Use the offset currently in effect for this particular time zone.
2022-04-13T22:47:58.123793 02:00
ZonedDateTime
通常最好使用完整的時區而不是僅僅使用偏移量。時區是由政治家決定的特定地區人民使用的偏移量的過去、現在和未來變化的命名歷史。
ZonedDateTime zdt = ZonedDateTime.now( ZoneId.of( "Europe/Berlin" ) ) ;
2022-04-13T22:47:58.126001 02:00[歐洲/柏林]
但有時我們需要處理偏移量而不是區域。使用資料庫執行 SQL 作業就是一個重要示例,因為 SQL 標準僅針對偏移量而非時區撰寫。
Instant
您詢問:
如何使用 Instant 獲得預期的輸出 2022-04-13T10:22:35.362644 02:00?
你不能。
該類Instant表示從 UTC 子午線偏移零小時-分鐘-秒的時刻。根據Instant定義,物件始終是“UTC 格式”,也就是說,偏移量為零。
如果您Instant手頭有,您可以調整到時區或偏移量。我建議不要假設您知道正確的偏移量,而是通過時區讓java.time查找當前有效的偏移量。
ZoneId z = ZoneId.of( "Europe/Berlin" ) ;
ZonedDateTime zdt = myInstant.atZone( z ) ;
OffsetDateTime odt = zdt.toOffsetDateTime() ;
提示:請注意,政客會以令人驚訝的頻率和令人不安的少量預警改變時區規則,從而改變偏移量。如果您感興趣的任何區域發生變化,請務必保持tzdata為最新。您將在 (a) JVM、(b) 主機作業系統和 (c) 可能在輔助系統(例如資料庫服務器)中找到tzdata檔案。
LocalDateTime
LocalDateTime在跟蹤時間線上的特定點時,切勿使用類。此類故意缺少時區或從 UTC 偏移的背景關系。的物件僅LocalDateTime帶有日期和時間,僅此而已。
我無法想象在任何情況下打電話LocalDateTime#now或LocalDateTime.ofInstant將是正確的做法。這樣做,您將故意丟棄重要資訊(時區或偏移量)。
uj5u.com熱心網友回復:
我不明白你為什么需要Instant. 以下代碼提供了您想要的輸出:
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public class Test {
public static void main(String[] args) {
System.out.println(ZonedDateTime.now().format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
}
}
當我運行上面的代碼時,我得到以下輸出:
2022-04-13T12:25:31.1157466 03:00
我的本地時區比 UTC 早三個小時。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/461664.html
