在 java.time 中设置 ZonedDateTime 上的时间?tl;博士不可变对象with()
2022-09-01 20:23:43
如何更改现有 ZonedDateTime
对象的时间部分?我想保留日期和时区,但更改小时和分钟。
如何更改现有 ZonedDateTime
对象的时间部分?我想保留日期和时区,但更改小时和分钟。
zdt.with ( LocalTime.of ( 16 , 15 ) )
java.time 类使用不可变对象模式来创建新对象,而不是更改(“改变”)原始对象。
with()
ZonedDateTime::with
方法是一种基于另一个但有特殊区别的新方法生成新的方法。您可以传递实现 TemporalAdjustor
接口的任何对象。ZonedDateTime
在本例中,我们只想更改一天中的时间。LocalTime
对象表示一天中没有任何日期和任何时区的时间。并实现了 TemporalAdjustor
接口。因此,在保持日期和时区不变的同时,仅应用该时间值。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[美国/New_York] |市场关闭时间:2016-01-04T16:00-05:00[美国/New_York] |持续时间: PT6H30M
请记住,在此示例中,我们还隐式调整了一天中时间的秒和小数秒。对象带有小时、分钟、秒和小数秒。我们指定了一小时一分钟。我们省略了秒和小数秒,导致在构造 .所有四个方面都应用了,以获得我们的新鲜感。LocalTime
0
LocalTime
LocalTime
ZonedDateTime
相当多的类实现了 TemporalAdjustor
接口。请参阅该类文档上的列表,包括 、 、 和等。因此,您可以传递其中任何一个来更改日期时间值的这一方面。LocalDate
Month
Year
阅读Hochschild的评论。当您指定对特定日期和区域无效的时间时,您必须了解该行为。例如,在夏令时 (DST) 转换期间。