[英]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.