在java.time中设置ZonedDateTime的时间?

时间:2016-04-27 23:49:58

标签: java java-time zoneddatetime

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

1 个答案:

答案 0 :(得分:21)

TL;博士

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

不可变对象

java.time类使用Immutable Objects模式创建新对象,而不是改变(“mutate”)原始对象。

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] | marketCloses:2016-01-04T16:00-05:00 [America / New_York] |持续时间:PT6H30M

请注意,在此示例中,我们还隐式调整时间中的秒数和小数秒LocalTime对象带有小时,分钟,秒和小数秒。我们指定了一小时一分钟。在构造0期间,我们省略了秒和小数秒,导致默认值为LocalTime。我们应用LocalTime的所有四个方面来获取新的ZonedDateTime

相当多的类实现了TemporalAdjustor接口。查看该类文档的列表,包括LocalDateMonthYear等。因此,您可以通过其中任何一个来改变日期时间值的这一方面。

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