我正在使用NodaTime在.Net核心WebApi中管理日期和时区。库中的一个类型是OffsetDateTime,它与.Net框架中的DateTimeOffset非常相似。我在任何地方都使用它来以显式和透明的方式操作日期,因为日期有时是系统时区和用户时区。
我需要在某个时间点将一个月添加到某个日期,但是我不能将一个月添加到一个OffsetDateTime对象中,我所能做的就是添加到小时或一个称为持续时间的独立于日历的类型。如果它是Instant类型,我会理解,因为Instant以一种非常抽象的方式表示一个时间点,而不是OffsetDateTime。OffsetDateTime甚至有一个“日历”属性,它真正显示了它绑定到一个日历系统,这个系统应该允许你像我想做的那样做算术,而不需要经过类型转换等。
最重要的是,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))你知道我怎么才能不经过类型转换就解决这个问题吗?也许我忽略了文档中的某些内容,但我不这么认为。
发布于 2019-04-26 02:14:29
OffsetDateTime表示一个本地日期时间和一个即时。
但是,它并不绑定到TimeZone。
出于这个原因,您可以从它添加一个“固定”数量,比如秒、分钟和小时,因为这些不是TimeZone依赖项。
你不能从它中减去一个月,因为它不能知道在过去的一个月里是否有日光转换。
我知道你想要一个没有类型转换的解决方案,但实际上你做不到。为了正确地处理这个问题,你必须将它转换成具有正确时区的ZonedDateTime。任何不指定时区的解决方案,最终都可能遇到结果错误的情况。
发布于 2019-04-26 01:37:14
您可以使用OffsetDateTime.With,它允许您提供LocalDate调整器。你可以操作(Plus,Minus,...)在带有Period的LocalDate上,它允许您以月为单位指定时间跨度:
public OffsetDateTime GetPreviousMonth(OffsetDateTime input)
{
return input.With((LocalDate ld) => ld.Minus(Period.FromMonths(1)));
}https://stackoverflow.com/questions/55854640
复制相似问题