24

如何更改现有ZonedDateTime对象的时间部分?我想保留日期和时区,但更改小时和分钟。

4

1 回答 1

44

tl;博士

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

不可变对象

java.time 类使用不可变对象模式来创建新对象,而不是更改(“变异”)原始对象。

with()

该方法是一种灵活的方法,可以基于另一个ZonedDateTime::with生成一个新的,但有一些特殊的区别。ZonedDateTime您可以传递任何实现该TemporalAdjustor接口的对象。

在这种情况下,我们只想更改时间。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[America/New_York] | 市场关闭时间:2016-01-04T16:00-05:00[America/New_York] | 持续时间:PT6H30M

请记住,在此示例中,我们还隐式调整时间中的秒和小数秒。该LocalTime对象带有小时、分钟、秒和小数秒。我们指定了一个小时和一分钟。我们省略了秒和小数秒,导致在0构建LocalTime. 所有四个方面都LocalTime被应用以获取我们的新鲜感ZonedDateTime

相当多的类实现了该TemporalAdjustor接口。请参阅该课程文档上的列表,包括LocalDateMonthYear等。因此,您可以传递其中任何一个来更改日期时间值的该方面。

阅读 Hochschild 的评论。当您指定对特定日期和区域无效的时间时,您必须了解该行为。例如,在夏令时 (DST) 切换期间。

于 2016-04-27T23:49:57.617 回答