在Linux上使用NodaTime可以使用DateTimeOffset将覆盖时区信息降至本地时间

时间:2018-12-11 09:03:55

标签: asp.net-core nodatime

我正在使用此处的代码来包装NodaTime函数,以将.NET Core 2.1 Web应用程序与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。

包装器返回一个DateTime,该日期将隐式转换为DateTimeOffset。

有人知道为什么会这样吗?

2 个答案:

答案 0 :(得分:3)

首先,我建议如果您使用Noda Time,则应尽可能广泛地使用它,而不是像这样的小口袋。使用BCL类型(DateTime等)的代码越少越好。

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

您获得的代码将LocalDateTime的{​​{1}}转换为DateTime。如注释中所述,您实际上是在代码中使用Kind。当UnspecifiedDateTimeOffsetDateTime时,从DateTimeOffsetKind的隐式转换将使用默认系统时区执行时区转换。 (这种隐式使用环境上下文是Noda Time试图防止的事情之一。)听起来您的Linux服务器有一个系统时区,而Windows服务器有一个不同的时区。

如果您想保留代码的Unspecified部分,但准确地表示特定时区中的某个时刻,则最简单的解决方法是更改​​返回Local的方法,然后调用{ {1}末尾的{1}}:

DateTimeOffset

答案 1 :(得分:0)

不是NodaTime问题。由不同服务器中的默认时区引起的问题。