首页 > 解决方案 > 几个时区(欧洲/尼科西亚)的 DST 进入时间使用 System.Globalization C# 报告错误的日期

问题描述

我正在尝试使用 C# 中的 System.Globalization 类获取 2020 年时区“Antarctica/McMurdo”的 DST 进入时间。我把它们当作

DST Entry Time: 9/29/2020 2:00:00 AM
DST Exit Time: 4/5/2020 2:59:59 AM

但根据https://www.timeanddate.com/time/change/antarctica/mcmurdo ,实际 DST 进入时间应该是 9/27/2020 2:00:00 AM

收到的进入时间已经在 DST 中,因此我的测试程序失败了,因为时间偏移没有发生。

下面是使用的代码片段

var currTimeZone = TimeZone.CurrentTimeZone;

var dstInfo = currTimeZone.GetDaylightChanges(now.Year);

DSTEntry = dstInfo.Start.ToString();

以下是我正在运行的 Mono 和 Ubuntu 的版本

Ubuntu 16.04.3 LTS

Mono JIT 编译器版本 5.4.0.201

这是zdump的输出

$ zdump 南极洲/麦克默多 -v 2019,2022

南极洲/麦克默多 2019 年 4 月 6 日星期六 13:59:59 UT = 2019 年 4 月 7 日星期日 02:59:59 NZDT isdst=1 gmtoff=46800

南极洲/麦克默多 2019 年 4 月 6 日星期六 14:00:00 UT = 2019 年 4 月 7 日星期日 02:00:00 NZST isdst=0 gmtoff=43200

南极洲/麦克默多 2019 年 9 月 28 日星期六 13:59:59 UT = 2019 年 9 月 29 日星期日 01:59:59 NZST isdst=0 gmtoff=43200

南极洲/麦克默多 2019 年 9 月 28 日星期六 14:00:00 UT = 2019 年 9 月 29 日星期日 03:00:00 NZDT isdst=1 gmtoff=46800

南极洲/麦克默多 2020 年 4 月 4 日星期六 13:59:59 UT = 2020 年 4 月 5 日星期日 02:59:59 NZDT isdst=1 gmtoff=46800

南极洲/麦克默多 2020 年 4 月 4 日星期六 14:00:00 UT = 2020 年 4 月 5 日星期日 02:00:00 NZST isdst=0 gmtoff=43200

南极洲/麦克默多 2020 年 9 月 26 日星期六 13:59:59 UT = 2020 年 9 月 27 日星期日 01:59:59 NZST isdst=0 gmtoff=43200

南极洲/麦克默多 2020 年 9 月 26 日星期六 14:00:00 UT = 2020 年 9 月 27 日星期日 03:00:00 NZDT isdst=1 gmtoff=46800

南极洲/麦克默多 2021 年 4 月 3 日星期六 13:59:59 UT = 2021 年 4 月 4 日星期日 02:59:59 NZDT isdst=1 gmtoff=46800

南极洲/麦克默多 2021 年 4 月 3 日星期六 14:00:00 UT = 2021 年 4 月 4 日星期日 02:00:00 NZST isdst=0 gmtoff=43200

南极洲/麦克默多 2021 年 9 月 25 日星期六 13:59:59 UT = 2021 年 9 月 26 日星期日 01:59:59 NZST isdst=0 gmtoff=43200

南极洲/麦克默多 2021 年 9 月 25 日星期六 14:00:00 UT = 2021 年 9 月 26 日星期日 03:00:00 NZDT isdst=1 gmtoff=46800

有人可以帮我解决这个时间问题吗?或者这是来自 C# 正在读取的 DLL/timezone_database 的错误?

谢谢

标签: c#.net-coretimezonemonodst

解决方案


从类的文档中TimeZone

警告

此 API 现在已过时

...

ⓘ 重要

尽可能使用TimeZoneInfo类而不是TimeZone 类。

...

该类TimeZone仅支持本地时区的单一夏令时调整规则。因此,TimeZone 该类可以准确地报告夏令时信息或仅在最新调整规则生效期间在 UTC 和本地时间之间进行转换。相比之下,TimeZoneInfo 该类支持多个调整规则,这使得处理历史时区数据成为可能。

简而言之,不要使用TimeZoneclass


推荐阅读