在 java.time 中设置 ZonedDateTime 的时间?
Set the time-of-day on a ZonedDateTime in java.time?
如何更改现有 ZonedDateTime
对象的时间部分?我想保留日期和时区但更改小时和分钟。
tl;博士
zdt.with ( LocalTime.of ( 16 , 15 ) )
不可变对象
java.time classes 使用 Immutable Objects 模式创建新对象而不是改变(“变异”)原始对象。
with()
ZonedDateTime::with
method is a flexible way to generate a new ZonedDateTime
based on another but with some particular difference. You can pass any object implementing the TemporalAdjustor
界面。
在这种情况下,我们只想更改一天中的时间。一个 LocalTime
object represents a time-of-day without any date and without any time zone. And LocalTime
implements the 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] | duration: PT6H30M
请记住,在本示例中,我们还隐式调整时间中的秒和小数秒。 LocalTime
对象带有小时、分钟、秒和小数秒。我们指定了一小时一分钟。我们在 LocalTime
的构造过程中遗漏了秒和小数秒,导致两者的默认值为 0
。 LocalTime
的所有四个方面都被应用到我们新鲜的 ZonedDateTime
.
相当多的 classes 实现了 TemporalAdjustor
接口。请参阅该 class 文档中的列表,包括 LocalDate
、Month
、Year
等。因此,您可以传递其中任何一个来更改日期时间值的那个方面。
阅读 Hochschild 的评论。当您指定对特定日期和区域无效的时间时,您必须了解该行为。例如,在夏令时 (DST) 切换期间。
如何更改现有 ZonedDateTime
对象的时间部分?我想保留日期和时区但更改小时和分钟。
tl;博士
zdt.with ( LocalTime.of ( 16 , 15 ) )
不可变对象
java.time classes 使用 Immutable Objects 模式创建新对象而不是改变(“变异”)原始对象。
with()
ZonedDateTime::with
method is a flexible way to generate a new ZonedDateTime
based on another but with some particular difference. You can pass any object implementing the TemporalAdjustor
界面。
在这种情况下,我们只想更改一天中的时间。一个 LocalTime
object represents a time-of-day without any date and without any time zone. And LocalTime
implements the 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] | duration: PT6H30M
请记住,在本示例中,我们还隐式调整时间中的秒和小数秒。 LocalTime
对象带有小时、分钟、秒和小数秒。我们指定了一小时一分钟。我们在 LocalTime
的构造过程中遗漏了秒和小数秒,导致两者的默认值为 0
。 LocalTime
的所有四个方面都被应用到我们新鲜的 ZonedDateTime
.
相当多的 classes 实现了 TemporalAdjustor
接口。请参阅该 class 文档中的列表,包括 LocalDate
、Month
、Year
等。因此,您可以传递其中任何一个来更改日期时间值的那个方面。
阅读 Hochschild 的评论。当您指定对特定日期和区域无效的时间时,您必须了解该行为。例如,在夏令时 (DST) 切换期间。