提问人:jpe230 提问时间:10/7/2023 最后编辑:halferjpe230 更新时间:10/13/2023 访问量:49
在解析去年的 ISO 字符串日期时,什么会导致不正确的 UTC 偏移量?
What could cause an incorrect UTC offset when parsing last year ISO string date?
问:
我不明白为什么它在某些环境下会失败。
我有一个在 Windows 11 下运行的 ASP.NET Web API (.NET Framework 4.8) 和一个作为客户端的 SPA。SPA 有一个用于过滤某些数据的日期选择器,日期作为 ISO 字符串发送,因此我的时区作为小时的一部分发送。通常这不是问题,但自今年年初(2023 年)以来,墨西哥政府取消了夏令时。这导致我的 WebApi 在处理 2023 年之前的日期时表现得很奇怪。
我的 SPA 在获取过去年份的日期时输出正确的偏移量。
例:
var year = 2023;
var month = 9;
var day = 6;
var today = new Date(year, month, day);
console.log(today.toISOString());
year = year - 1; // Get last year date (should apply DST)
var lastYearDate = new Date(year, month, day);
console.log(lastYearDate .toISOString());
以上结果是:
2023-10-06T06:00:00.000Z // Offset GMT-6
2022-10-06T05:00:00.000Z // Offset GMT-5 w/DST
请注意,在创建 2023 年之前的日期时,它如何正确应用偏移量。
使用 .NET Framework + Windows 11 解析字符串时,我得到正确的结果:
static void PrintDate()
{
// Current Year no DST (GMT - 6)
var isoDate1 = "2023-10-06T06:00:00.000Z";
var dateTime1 = Convert.ToDateTime(isoDate1);
var dateToIso1 = dateTime1.ToString("o", System.Globalization.CultureInfo.InvariantCulture);
// Last year with DST(GMT - 5)
var isoDate2 = "2022-10-06T05:00:00.000Z";
var dateTime2 = Convert.ToDateTime(isoDate2);
var dateToIso2 = dateTime2.ToString("o", System.Globalization.CultureInfo.InvariantCulture);
Console.WriteLine($"The parsed date is: {dateToIso1}");
Console.WriteLine($"The parsed date is: {dateToIso2}");
}
结果是:
The parsed date is: 2023-10-06T00:00:00.0000000-06:00
The parsed date is: 2022-10-06T00:00:00.0000000-05:00
它在我的机器中看起来不错,因为 .NET 正确地应用了偏移量,GMT-6 适用于今年,GMT-5 适用于前一年。但是,当部署到 Windows Server 计算机(2019 年或 2022 年)时,我会得到不同的偏移量。
Windows Server 的结果:
The parsed date is: 2023-10-06T00:00:00.0000000-06:00
The parsed date is: 2022-10-05T23:00:00.0000000-06:00
请注意它现在如何对 2022 年的日期应用错误的偏移量,这会导致有一天回滚并给我错误的数据。
是什么原因导致了这种行为?
我已经试过了:
- 将服务器更新到最新版本
- 更新 .NET Framework
- 确保服务器的时区设置为与我的计算机相同的时区(CST 墨西哥城,无 DST)
由于 DST 的删除是最近才发生的,因此我的 IT 部门向我保证,服务器已经包含必要的更新来处理 DST 的缺失。在没有这些更新的情况下创建新 VM 会导致服务器在系统时钟和当前年份的日期解析中具有 +1 小时 (GMT-5) 的偏移量。
我希望 Windows Server/.NET 框架在使用相同的时区时会应用正确的偏移量,而不管它正在运行什么机器。
答:
...但是,当部署到 Windows Server 计算机(2019 年或 2022 年)时,我会得到不同的偏移量。
然后,可能需要将 Windows 更新应用于运行代码的 Windows Server 计算机。
...我的 IT 部门向我保证,服务器已经包含必要的更新......
您的结果证明并非如此。已部署到的计算机上不存在所需的更新。此处列出了墨西哥 DST 的特定知识库文章,作为公告的一部分列出。这是来自Microsoft的DST / TZ博客。您可能希望将其传递给您的 IT 部门。
评论