2016-04-27 42 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可以制作一个自动调整(推进式战略),承认罕见的情况,而且对于市场时代来说极不可能。 –