gpt4 book ai didi

c# - Windows 上的 kestrel 和 macOs/linux 上的 kestrel 之间的日期反序列化差异

转载 作者:行者123 更新时间:2023-12-04 08:22:27 27 4
gpt4 key购买 nike

我曾尝试在 net.core 文档(问题等)上搜索信息但没有结果。
代码更简单:

    [HttpGet()]
[Route("dob")]
public string dobTest()
{
var content = @"""1942-01-01T22:00:00.000Z""";
var settings = new JsonSerializerSettings()
{
//DateFormatHandling = DateFormatHandling.IsoDateFormat,
//DateParseHandling = DateParseHandling.DateTimeOffset,
DateTimeZoneHandling = DateTimeZoneHandling.Local,
//DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind
};
var dob = JsonConvert.DeserializeObject<DateTime>(content, settings);

return $"dob: {dob.ToString("yyyy-MM-dd HH:mm:ss.fff")} - {dob.Kind}";
}
如果我在 Mac 或 Linux 上运行此代码,结果是:

dob: 1942-01-02 00:00:00.000 - Local


如果我在 Windows 上运行此代码,结果是:

dob: 1942-01-01 23:00:00.000 - Local


我的 MacOs 时区设置在罗马(UTC +01:00)
Windows 时区设置为罗马(UTC +01:00)
Newtonsoft.Json 的版本是 12.0.3
net框架版本为net core 3.1

最佳答案

Linux 和 OSX 都使用 IANA time zone database为其主要时区信息来源,其中有正确的 historical data for time zones in 1942 in Rome , 在标识符 Europe/Rome 下.您可以看到 UTC+2 是给定日期的正确偏移量 here以及。
另一方面,Windows 没有这个时区的历史记录。等效的 Windows 标识符是 W. Europe Standard Time ,其英文显示名称为 (UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna .您可以在注册表中的以下项下看到 Windows 的数据:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\W. Europe Standard Time
如果您使用 RegEdit 检查此键,您会注意到与其他几个时区不同的是,没有 Dynamic DST此区域的子项。这意味着 Windows 不知道 DST 规则中的任何历史差异,因此每年都在同一组规则下进行处理。
Windows 确实有某些区域的历史数据,但一般而言,Microsoft 仅根据其 DST/TZ support policy 保证自 2010 年以来的历史准确性。 .
因此,如果您的应用程序需要历史时区的准确性,那么您应该只使用 IANA 时区。在 .NET 中,您可以通过使用 Noda Time 中的 TZDB 提供程序来做到这一点。图书馆。

关于c# - Windows 上的 kestrel 和 macOs/linux 上的 kestrel 之间的日期反序列化差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65436081/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com