2016-04-27 99 views

回答

13

TL;博士

zdt.with (LocalTime.of (16 , 15)) 

不可變對象

的java.time類使用Immutable Objects圖案來創建新的對象,而不是改變(「發生變異」)原始對象。

with()

ZonedDateTime::with方法是基於另一個但也有一些特別的差異新ZonedDateTime的靈活方式。您可以傳遞任何實現TemporalAdjustor接口的對象。

在這種情況下,我們只想改變時間。 A LocalTime對象表示沒有任何日期且沒有任何時區的時間。並且LocalTime實現TemporalAdjustor接口。因此,只保留時間值,同時保留日期和時區。

ZonedDateTime marketOpens = ZonedDateTime.of (LocalDate.of (2016 , 1 , 4) , LocalTime.of (9 , 30) , ZoneId.of ("America/New_York")); 
ZonedDateTime marketCloses = marketOpens.with (LocalTime.of (16 , 0)); 

仔細檢查時間跨度的持續時間是否與預期的一樣,爲六個半小時。

Duration duration = Duration.between (marketOpens , marketCloses); 

轉儲到控制檯。

System.out.println ("marketOpens: " + marketOpens + " | marketCloses: " + marketCloses + " | duration: " + duration); 

marketOpens:2016-01-04T09:30-05:00 [美國/紐約] |市場關閉:2016-01-04T16:00-05:00 [America/New_York] |持續時間:PT6H30M

請記住,在這個例子中,我們也隱含調整秒和分數第二在時間的一天。 LocalTime對象攜帶小時,分鐘,秒和小數秒。我們指定了一小時一分鐘。我們省略了秒和小數秒,導致在構建我們的LocalTime期間,默認值爲0。應用LocalTime的所有四個方面以獲得我們的新鮮ZonedDateTime

只有幾個類實現TemporalAdjustor接口。請參閱該班級文檔的列表,其中包括LocalDateMonth,Year等。所以你可以通過任何這些來改變日期時間值的方面。

閱讀Hochschild的評論。當您指定一個對特定日期&區域無效的時間時,您必須瞭解其行爲。例如,在夏令時(DST)切換期間。

+1

正確的例子。然而,市場開放和關閉時間通常被定義爲當地時間,而不是UTC時間戳,所以'LocalDateTime'和'LocalTime'類型通常是更好的匹配(並且還提供'()()' - 方法)。但是如果你仍然堅持'ZonedDateTime',那麼如果在夏季 - 冬季時間切換期間設置的時間偏離最終觀察到的結果對象,那麼不要太驚訝,因爲JSR-310可以製作一個自動調整(推進式戰略),承認罕見的情況,而且對於市場時代來說極不可能。 –