簡體   English   中英

windows 上的紅隼和 macOS/Linux 上的紅隼之間的日期反序列化差異

[英]Date deserialization difference between kestrel on windows and kestrel on macOs/linux

我嘗試在 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 上運行此代碼,結果是:

出生日期:1942-01-02 00:00:00.000 - 本地

如果我在 windows 上運行此代碼,結果是:

出生日期:1942-01-01 23:00:00.000 - 本地

我的 MacOs 時區設置在羅馬(UTC +01:00) Windows 時區設置在羅馬(UTC +01:00)

Newtonsoft.Json 的版本是 12.0.3 net framework 的版本是 net core 3.1

Linux 和 OSX 都使用IANA 時區數據庫作為其時區信息的主要來源,該數據庫具有1942 年羅馬時區的正確歷史數據,標識符為Europe/Rome 您可以看到 UTC+2 也是此處給出的日期的正確偏移量。

另一方面,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 支持政策保證自 2010 年以來的歷史准確性。

因此,如果您的應用程序需要歷史時區准確性,那么您應該只使用 IANA 時區。 在 .NET 中,您可以使用Noda Time庫中的 TZDB 提供程序來執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM