在 Linux 上使用 NodaTime 会在使用 DateTimeOffset 转换为本地时间时删除时区信息

Using NodaTime on Linux drops timezone info on coverting to local time using DateTimeOffset

我正在使用此处的代码包装 NodaTime 函数,以便为 .NET Core 2.1 网络应用程序转换 to/from UTC/Local 次。: https://www.joeaudette.com/blog/2016/06/23/cross-platform-timezone-handling-for-aspnet-core

这在 Windows 本地工作正常,但当部署到 linux 服务器时,转换为本地时间会删除时区信息(例如日期时间之后的 +13:00)。

我正在使用 NodaTime 2.4.2。

包装器 returns 隐式转换为 DateTimeOffset 的 DateTime。

有谁知道为什么会这样?

不是 NodaTime 问题。不同服务器默认时区导致的问题。

首先,我建议如果您使用野田时间,请尽可能广泛地使用它,而不是像这样在小口袋里使用它。使用 BCL 类型(DateTime 等)的代码越少越好。

这里的问题不是由 Noda Time 引起的 - 它是由从 DateTimeDateTimeOffset 的转换引起的。

您获得的代码将 LocalDateTime 转换为 DateTimeKindUnspecified。如评论中所述,您实际上在代码中使用 DateTimeOffset 。当 KindUnspecifiedLocal 时,从 DateTimeDateTimeOffset 的隐式转换将使用默认系统时区执行时区转换。 (这种对环境上下文的隐式使用是 Noda Time 试图阻止的事情之一。)听起来你的 Linux 服务器有一个系统时区,而 Windows 服务器有不同的系统时区。

如果您想保留代码的 DateTimeOffset 部分,但要准确表示特定时区的瞬间,最简单的解决方法是将方法更改为 return DateTimeOffset,然后在 ConvertToLocalTime:

的末尾调用 ZonedDateTime.ToDateTimeOffset
return new ZonedDateTime(instant, timeZone).ToDateTimeOffset();