我正在使用此处的代码来包装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。
有人知道为什么会这样吗?
答案 0 :(得分:3)
首先,我建议如果您使用Noda Time,则应尽可能广泛地使用它,而不是像这样的小口袋。使用BCL类型(DateTime
等)的代码越少越好。
这里的问题不是由Noda Time引起的-它是由DateTime
到DateTimeOffset
的转换引起的。
您获得的代码将LocalDateTime
的{{1}}转换为DateTime
。如注释中所述,您实际上是在代码中使用Kind
。当Unspecified
为DateTimeOffset
或DateTime
时,从DateTimeOffset
到Kind
的隐式转换将使用默认系统时区执行时区转换。 (这种隐式使用环境上下文是Noda Time试图防止的事情之一。)听起来您的Linux服务器有一个系统时区,而Windows服务器有一个不同的时区。
如果您想保留代码的Unspecified
部分,但准确地表示特定时区中的某个时刻,则最简单的解决方法是更改返回Local
的方法,然后调用{ {1}末尾的{1}}:
DateTimeOffset
答案 1 :(得分:0)
不是NodaTime问题。由不同服务器中的默认时区引起的问题。