根据时区信息计算的 UTC 日期时间不正确



我有一个时区信息中欧标准时间,显示UTC +01:00,当我执行代码时,它显示时间前 2 小时而不是 1 小时。下面是示例代码

static void Main(string[] args)
    {
        var strTimeZoneInfo = "Central Europe Standard Time";
        var datetimeDST = Convert.ToDateTime("2019-07-18 18:17:00");
        var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(strTimeZoneInfo);
        var dtUTC= TimeZoneInfo.ConvertTimeToUtc(datetimeDST, timeZoneInfo);
        Console.WriteLine(Convert.ToString(dtUTC));
        Console.ReadKey();
    }
因此,我得到的不是2019-07-18 17:17:00,

而是2019-07-18 16:17:00。有人可以解释如何在不使用 Noda 或其他外部库的情况下解决此问题。

参考以下链接,但不清楚如何解决此问题。

  • UTC 转换为中欧标准时间是前面 2 小时而不是 1 小时
  • 是否有适用于中欧的通用时区信息?

还提到了此链接的答案,但它不起作用。

尽管"中欧标准时间"是该TimeZoneInfoId属性,但它实际上处理该时区内的标准时间和夏令时,具体取决于您谈论的日期。我知道这很令人困惑,因为时区信息在显示名称中包含"UTC+01:00",即使它目前处于夏令时。

但在这种情况下,您给出的日期是在夏令时期间,因此偏移量应该是 +02:00 ,而不是+01:00 。库正在生成正确的结果。

var strTimeZoneInfo = "Central Europe Standard Time";
var datetimeDST = Convert.ToDateTime("2019-07-18 18:17:00");
var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(strTimeZoneInfo);
Console.WriteLine(timeZoneInfo.DisplayName);
Console.WriteLine(timeZoneInfo.StandardName);
Console.WriteLine(timeZoneInfo.DaylightName);
Console.WriteLine(timeZoneInfo.IsDaylightSavingTime(datetimeDST));
Console.WriteLine(timeZoneInfo.GetUtcOffset(datetimeDST));
var dtUTC = TimeZoneInfo.ConvertTimeToUtc(datetimeDST, timeZoneInfo);
Console.WriteLine(dtUTC.ToString(CultureInfo.InvariantCulture));

输出:

(UTC+01:00( 贝尔格莱德, 布拉迪斯拉发, 布达佩斯, 卢布尔雅那, 布拉格
中欧标准时间
中欧夏令时

02:00:00
2019-07-18 16:17:00

最新更新