如何设置ZonedDateTime';s在Nodatime中的时间分量正确

本文关键字:Nodatime 时间 分量 何设置 设置 ZonedDateTime | 更新日期: 2023-09-27 18:29:29

我有一个方法,应该返回工作日的开始时间,例如,上午9点从ZonedDateTime返回,它将其作为参数:

public ZonedDateTime GetWorkStartTime(ZonedDateTime zdt) => (zdt.Zone.AtStartOfDay(zdt.Date).Date + WorkDayStartTime).InZone(zdt.Zone, CommonLenientResolver);

WorkDayStartTimenew LocalTime(9, 0)

CommonLenientResolver是一个自定义解析器,请参阅Nodatime 中比较不同时区的LocalDateTime中的实现

因此,对于任何特定的zdt,我希望确保返回值始终是zdt参数所代表的当天上午9点。

正如AtStartOfDay(…)的文档中所述,如果一天中的午夜不存在时钟变化(例如,时钟在午夜直接移动到凌晨1点),Nodatime将自动使用下一个可用实例,即凌晨1点。在我目前的实现中,我在AtStartOfDay(…)上增加了9个小时,因此,如果一天的开始时间是上午1点,我的GetWorkStartTime(…)将返回上午10点,这是我希望避免的。

我使用的是Nodatime 1.3.1。

如何设置ZonedDateTime';s在Nodatime中的时间分量正确

听起来你根本不需要使用AtStartOfDay——只需使用日期并添加你的WorkDayStartTime:

public ZonedDateTime GetWorkStartTime(ZonedDateTime zdt) =>
    (zdt.Date + WorkDayStartTime).InZone(zdt.Zone, CommonLenientResolver);

或者,如果你发现它更清晰:

public ZonedDateTime GetWorkStartTime(ZonedDateTime zdt) =>
    zdt.Date.At(WorkDayStartTime).InZone(zdt.Zone, CommonLenientResolver);

假设您的解析器以您希望的方式处理跳过/不明确值的所有内容,那应该没问题。