【发布时间】:2020-04-17 08:42:17
【问题描述】:
我们需要将时间设置为最近的任意间隔(例如,由时间跨度或持续时间表示)。
假设我们需要将它降到最接近的十分钟。 例如13:02 变为 13:00,14:12 变为 14:10
如果不使用 Nodatime,您可以执行 this: 之类的操作
// Floor
long ticks = date.Ticks / span.Ticks;
return new DateTime( ticks * span.Ticks );
这将使用时间跨度的刻度将日期时间设置为特定时间。
似乎 NodaTime 暴露了一些我们以前没有考虑过的复杂性。你可以这样写一个函数:
public static Instant FloorBy(this Instant time, Duration duration)
=> time.Minus(Duration.FromTicks(time.ToUnixTimeTicks() % duration.BclCompatibleTicks));
但该实现似乎并不正确。 “最近十分钟的地板”似乎取决于时区/时间偏移量。 虽然在 UTC 中可能是 13:02,但在偏移量为 +05:45 的尼泊尔,时间将是 18:47。
这意味着在 UTC 中,精确到十分钟意味着减去两分钟,而在尼泊尔,这意味着减去七分钟。
我觉得我应该能够以某种方式将 ZonedDateTime 或 OffsetDateTime 舍入任意时间跨度。我可以通过编写这样的函数来接近
public static OffsetDateTime FloorToNearestTenMinutes(this OffsetDateTime time)
{
return time
.Minus(Duration.FromMinutes(time.Minute % 10))
.Minus(Duration.FromSeconds(time.Second));
}
但这不允许我指定任意持续时间,因为 OffsetDateTime 没有刻度的概念。
如何在考虑时区的情况下以任意间隔正确舍入 Instant/ZonedDateTime/OffsetDateTime?
【问题讨论】: