Asp.net core 在Linux上使用NodeTime会删除使用DateTimeOffset转换为本地时间的时区信息

Asp.net core 在Linux上使用NodeTime会删除使用DateTimeOffset转换为本地时间的时区信息,asp.net-core,nodatime,Asp.net Core,Nodatime,我正在使用此处的代码包装节点时间函数,以转换为.NET Core 2.1 web应用程序的UTC/本地时间 这在Windows上可以在本地正常工作,但是当部署到linux服务器时,转换为本地时间会删除时区信息(例如,日期时间后的+13:00) 我使用的是NodaTime2.4.2 包装器返回一个被隐式转换为DateTimeOffset的DateTime 有人知道为什么会发生这种情况吗?不是节点时间问题。不同服务器的默认时区导致的问题。首先,我建议如果您使用Noda Time,请尽可能广泛地使用

我正在使用此处的代码包装节点时间函数,以转换为.NET Core 2.1 web应用程序的UTC/本地时间

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

我使用的是NodaTime2.4.2

包装器返回一个被隐式转换为DateTimeOffset的DateTime


有人知道为什么会发生这种情况吗?

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

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

这里的问题并不是由野田佳彦时间引起的,而是由从
DateTime
DateTimeOffset
的转换引起的

您得到的代码将
LocalDateTime
转换为
DateTime
,其
种类为
未指定的
。如注释中所述,您实际上在代码中使用了
DateTimeOffset
。当
种类
未指定
本地
时,从
日期时间
日期时间偏移
的隐式转换将使用默认系统时区执行时区转换。(这种对环境上下文的隐式使用是Noda Time试图阻止的事情之一。)听起来您的Linux服务器有一个系统时区,而Windows服务器有一个不同的时区

如果希望保留代码的
日期时间偏移量
部分,但要准确地表示特定时区中的某个瞬间,最简单的解决方法是更改返回
日期时间偏移量
的方法,只需在
转换到本地时间
结束时调用
ZonedDateTime.ToDateTimeOffset

return new ZonedDateTime(instant, timeZone).ToDateTimeOffset();

欢迎来到堆栈溢出。请您提供一个(理想情况下作为控制台应用程序而不是web应用程序),包括您正在使用的时区ID和时区提供程序吗?单独的问题.net时间api的确切问题是什么,使您选择具有不可预测的支持和支持的第三方apiquality@DoguArslan:我怀疑如果你在野田佳彦时间发现一个bug,我会比你在
DateTime
:)你可能想阅读库背后的动机。@JonSkeet的问题是OP。我想知道他在.Net实现中遇到了什么具体问题,需要恢复到自定义的第三方api。@DoguArslan:OP似乎没有响应,我想我会提供一些可能有人想使用Noda Time的原因。还有很多其他方法,比如使用IANA时区ID,以及对使用哪个时区数据版本进行更多控制。你会问某人为什么在JavaScriptSerializer上使用Json.NET吗?对于您来说,询问一个合理常用且成熟的库似乎是一个奇怪的问题,尤其是对实现和支持质量的诽谤。如果您认为值得保留这个问题,我将添加一个更详细的答案。@JonSkeet Hi。我很乐意保留或关闭它。你的问题帮了我很大的忙,所以也许值得留下来解释DateTimeOffset的正确用法。然而,也许它在错误的地方?我以前试过关闭罚单,但我不知道怎么关闭。正确的做法是什么?在这一点上,可能值得保持现状。您可以通过在问题中提到
DateTimeOffset
来改进它,但在这一点上没有问题。