在java.time中的ZoneDateTime上设置一天的时间?

在java.time中的ZoneDateTime上设置一天的时间?,java,java-time,zoneddatetime,Java,Java Time,Zoneddatetime,如何更改现有对象的时间部分?我想保留日期和时区,但改变小时和分钟。tl;博士 不变对象 time类使用该模式来创建新对象,而不是改变(“变异”)原始对象 with() 该方法是一种灵活的方法,可以基于另一种方法生成新的ZoneDateTime,但有一些特殊的区别。可以传递实现接口的任何对象 在这种情况下,我们只想改变一天中的时间。对象表示一天中没有日期和时区的时间。而LocalTime实现了该接口。因此,只应用该时间值,同时保持日期和时区不变 ZonedDateTime marketOpens

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

tl;博士 不变对象 time类使用该模式来创建新对象,而不是改变(“变异”)原始对象

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

在这种情况下,我们只想改变一天中的时间。对象表示一天中没有日期和时区的时间。而
LocalTime
实现了该接口。因此,只应用该时间值,同时保持日期和时区不变

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 );
市场开放时间:2016-01-04T09:30-05:00[美国/纽约];市场关闭时间:2016-01-04T16:00-05:00[美国/纽约];持续时间:PT6H30M

请记住,在本例中,我们还隐式地调整了一天中的秒数和分数秒数。
LocalTime
对象携带小时、分钟、秒和分数秒。我们指定了一小时一分钟。在构建
LocalTime
的过程中,我们省略了秒和分数秒,导致这两个时间段的默认值均为
0
LocalTime
的所有四个方面都被应用于获取新的
zoneDateTime

相当多的类实现了该接口。查看该类文档上的列表,包括
LocalDate
Month
Year
,等等。因此,您可以传递其中任何一个来更改日期时间值的这一方面


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

纠正示例。但是,市场开盘和收盘时间通常定义为本地时间,而不是UTC时间戳,因此类型
LocalDateTime
LocalTime
通常更匹配(并且还提供
with()
-方法)。但是,如果您仍然坚持分区DateTime,那么如果夏冬季时间切换期间的设定时间与您最终在结果对象中观察到的时间有偏差,则不要太惊讶,因为JSR-310可以进行自动调整(向前推策略),这是一种罕见的情况,对于市场时间来说是极不可能的。。
System.out.println ( "marketOpens: " + marketOpens + " | marketCloses: " + marketCloses + " | duration: " + duration );