为什么我不能向 OffsetDateTime 添加月份?

Mor*_*oth 7 c# nodatime asp.net-core

我正在使用 NodaTime 管理 .Net Core WebApi 中的日期和时区。库中的类型之一是 OffsetDateTime,它与 .Net 框架中的 DateTimeOffset 非常相似。我在任何地方都使用它以明确且透明的方式操作日期,因为日期有时会进入系统时区和用户时区。

我需要在某个时间点向某个日期添加一个月,但我无法向 OffsetDateTime 对象添加一个月,我所能做的就是累加直到小时或与日历无关的称为 Duration 的类型。如果它是 Instant 类型,我会理解,因为 Instant 以一种非常抽象的方式表示时间点,但不是 OffsetDateTime。OffsetDateTime 甚至有一个“日历”属性,它确实显示它绑定到日历系统,该系统应该允许您像我想做的那样进行算术,而不必进行类型转换等。

最重要的是,DateTimeOffset(来自 .net 框架)允许您添加月份,但我希望保持一致并在各处使用相同的类型。

长话短说,我做不到:

public OffsetDateTime GetPreviousMonth(OffsetDateTime input)
{
    return input.AddMonths(-1)
}
Run Code Online (Sandbox Code Playgroud)

我只能做:

offsetDateTime.PlusHours(15)
offsetDateTime.PlusMinutes(3000)
offsetDateTime.Minus(Duration.FromMinutes(60))
offsetDateTime.Minus(Duration.FromHours(1))
Run Code Online (Sandbox Code Playgroud)

知道如何在不进行类型转换的情况下解决这个问题吗?也许我忽略了文档中的某些内容,但我不这么认为。

Ort*_*iga 5

AnOffsetDateTime表示本地日期时间与 UTC 的偏移量,以及Instant。

但是,它不受时区的限制。

因此,您可以从中添加“固定”数量,例如秒、分钟和小时,因为这些不依赖于时区。

您不能从中减去一个月,因为它无法知道过去一个月是否有日光转换。

我知道您要求一种无需类型转换的解决方案,但实际上您不能。要正确处理此问题,您必须将其转换为ZonedDateTime具有正确时区的时间。任何不指定时区的解决方案最终都可能会遇到结果错误的情况。