在 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 引起的 - 它是由从 DateTime
到 DateTimeOffset
的转换引起的。
您获得的代码将 LocalDateTime
转换为 DateTime
,Kind
为 Unspecified
。如评论中所述,您实际上在代码中使用 DateTimeOffset
。当 Kind
为 Unspecified
或 Local
时,从 DateTime
到 DateTimeOffset
的隐式转换将使用默认系统时区执行时区转换。 (这种对环境上下文的隐式使用是 Noda Time 试图阻止的事情之一。)听起来你的 Linux 服务器有一个系统时区,而 Windows 服务器有不同的系统时区。
如果您想保留代码的 DateTimeOffset
部分,但要准确表示特定时区的瞬间,最简单的解决方法是将方法更改为 return DateTimeOffset
,然后在 ConvertToLocalTime
:
的末尾调用 ZonedDateTime.ToDateTimeOffset
return new ZonedDateTime(instant, timeZone).ToDateTimeOffset();
我正在使用此处的代码包装 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 引起的 - 它是由从 DateTime
到 DateTimeOffset
的转换引起的。
您获得的代码将 LocalDateTime
转换为 DateTime
,Kind
为 Unspecified
。如评论中所述,您实际上在代码中使用 DateTimeOffset
。当 Kind
为 Unspecified
或 Local
时,从 DateTime
到 DateTimeOffset
的隐式转换将使用默认系统时区执行时区转换。 (这种对环境上下文的隐式使用是 Noda Time 试图阻止的事情之一。)听起来你的 Linux 服务器有一个系统时区,而 Windows 服务器有不同的系统时区。
如果您想保留代码的 DateTimeOffset
部分,但要准确表示特定时区的瞬间,最简单的解决方法是将方法更改为 return DateTimeOffset
,然后在 ConvertToLocalTime
:
ZonedDateTime.ToDateTimeOffset
return new ZonedDateTime(instant, timeZone).ToDateTimeOffset();