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

标签 c# asp.net-core nodatime

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

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

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

长话短说,我做不到:

public OffsetDateTime GetPreviousMonth(OffsetDateTime input)
{
    return input.AddMonths(-1)
}

我只能做:

offsetDateTime.PlusHours(15)
offsetDateTime.PlusMinutes(3000)
offsetDateTime.Minus(Duration.FromMinutes(60))
offsetDateTime.Minus(Duration.FromHours(1))

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

最佳答案

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

但是,它没有绑定(bind)到时区。

因此,您可以从中添加一个“固定”数量,例如秒、分钟和小时,因为它们不依赖于 TimeZone。

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

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

关于c# - 为什么我不能向 OffsetDateTime 添加月份?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55854640/

相关文章:

c# - 如何使 EF-Core 使用 Guid 而不是字符串作为其 ID/主键

asp.net-core - AuthorizeRouteView 不适用于已注销的用户

c# - 应使用哪种野田时间类型来计算特定日期与今天之间的年/月/日?

c# - 使用 NodaTime 从字符串创建时间偏移

c# - 使用正则表达式检查字符串中的特定字符

c# - 有没有更好的方法来确定大型 txt 文件(1-2 GB)中的行数?

docker - Docker中的.NET Core 2.0 Identity Server + MVC-在MacOS上构建失败

c# - 使用 JSON.NET 和 NodaTime 从 JSON 反序列化 LocalTime 导致 NodaTime.Text.UnparsableValueException

c# - C# await 关键字是否会导致函数调用阻塞?

c# - 如何分配点击事件