tl;dr
OffsetDateTime.now().getOffset()
但您可能應該使用時區而不是僅僅偏離UTC。
ZoneId.systemDefault()
Offset versus Time Zone
offset-from-UTC只是一小時,幾分鐘和幾秒鐘 - 僅此而已。
time zone是特定地區人民使用的偏移的過去,現在和未來變化的歷史。時區有一組規則來處理諸如Daylight Saving Time (DST)之類的異常,這些異常會導致特定時間段內偏移的變化。
時區=(偏移歷史+異常規則)
因此,在知道時更好地使用區域。
任何地區的偏移量隨時間而變化。例如,DST in the United States將偏移量移動一個小時,大約一半,然后在一年的另一半中將該小時恢復到偏移量。時區的整個目的是記錄偏移量的變化。
因此,在沒有日期時間的情況下要求偏移是沒有意義的。在America/Los_Angeles,例如在今年的部分時間,補償是-08:00,但在夏令時期間的另一部分是-07:00。
OffsetDateTime
OffsetDateTime odt = OffsetDateTime.now ();
ZoneOffset zoneOffset = odt.getOffset ();
odt.toString():2017-01-02T15:19:47.162-08:00
zoneOffset.toString(): - 08:00
now方法實際上是隱式應用JVM的當前默認時區。我建議您始終通過指定所需/預期的時區來明確說明。即使您想要當前的默認區域,也要明確說明您的意圖。消除關于您是否打算默認或未能考慮時區的模糊性,因為程序員經常會這樣做。打電話給ZoneId.systemDefault。
OffsetDateTime odt = OffsetDateTime.now ( ZoneId.systemDefault () );
ZoneOffset zoneOffset = odt.getOffset ();
ZoneId.systemDefault()。toString():America / Los_Angeles
自:2017-01-02T15:19:47.162-08:00
zoneOffsetOfOdt:-08:00
關于依賴于默認區域的注意事項:此默認值可隨時由JVM中任何線程中的任何代碼更改。如果重要,請詢問用戶預期的時區。
您可以將偏移量作為總秒數詢問偏移量。
int offsetSeconds = zoneOffset.getTotalSeconds ();
offsetSeconds:-28800
ZonedDateTime
另一個例子:也許你想知道今年圣誕節在魁北克會有什么補償。指定時區America/Montreal,得到一個ZonedDateTime,請求它作為ZoneOffset對象的偏移量。
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate ld = LocalDate.of( 2017 , 12 , 25 );
ZonedDateTime zdtXmas = ld.atStartOfDay( z );
ZoneOffset zoneOffsetXmas = zdtXmas.getOffset();
zdtXmas.toString():2017-12-25T00:00-05:00 [美國/蒙特利爾]
zoneOffsetXmas.toString(): - 05:00
zoneOffsetXmas.getTotalSeconds(): - 18000
ZoneId
正如yanys的評論中所建議的,你可以通過傳遞一個時刻作為ZoneId來查詢ZoneOffset特定的Instant。 Instant類代表UTC時間軸上的一個時刻,分辨率為nanoseconds(小數部分最多九(9)位)。
這只是通往同一目的地的另一條路線。就像上面討論的OffsetDateTime和ZonedDateTime一樣,我們指定(a)時區,(b)片刻。
Instant instant = zdtXmas.toInstant();
ZoneOffset zo = z.getRules().getOffset( instant );
對于ZoneId:美國/蒙特利爾立即:2017-12-25T05:00:00Z ZoneOffset為:-05:00
ZoneOffset.systemDefault - 錯誤或功能?
ZoneOffset類是ZoneId的子類,記錄為繼承systemDefault方法。但是,這實際上并不起作用。
ZoneOffset zoneOffset = ZoneOffset.systemDefault() ; // Fails to compile.
錯誤:不兼容的類型:ZoneId無法轉換為ZoneOffset
不確定這個編譯失敗是錯誤還是功能。如上所述,對于我來說,要求使用日期時間的默認偏移似乎沒有意義,所以也許ZoneOffset.systemDefault確實會失敗。但文檔應該這樣說,并附上解釋。
我試圖提交一個關于文檔無法解決此問題的錯誤,但放棄了,無法確定在何處以及如何提交此類錯誤報告。
About java.time
要了解更多信息,請參閱Oracle Tutorial。并搜索Stack Overflow以獲取許多示例和解釋。規格是JSR 310。
您可以直接與數據庫交換java.time對象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*類。
從哪里獲取java.time類?
Java SE 8,Java SE 9,Java SE 10,Java SE 11和更高版本 - 帶有捆綁實現的標準Java API的一部分。
Java 9增加了一些小功能和修復。
Android
更高版本的Android捆綁java.time類的實現。
對于早期的Android(<26),ThreeTenABP項目適應ThreeTen-Backport(如上所述)。見How to use ThreeTenABP…。
ThreeTen-Extra項目使用其他類擴展了java.time。該項目是未來可能添加到java.time的試驗場。你可能會在這里找到一些有用的類,如Interval,YearWeek,YearQuarter和more。