关于c#:根据DayLight节省时间,将datetime(local或utc)转换为莫斯科和基辅时区问题

Converting datetime (local or utc) to Moscow and Kiev timezone issues depending on DayLight saving time

有一些时区可以切换到DayLight节省时间而不是。我知道俄罗斯不会转向这一次,而乌克兰则转向DayLight节省时间。

据我所知,来自奥尔森时区的.NET TimeZoneInfo使用俄罗斯标准时间和基辅(乌克兰)使用FLE标准时间。

我的测试是:

  • 冬天,俄罗斯,DateTimeKind.Utc

  • 冬天,俄罗斯,DateTimeKind.Local

  • 夏天,俄罗斯,DateTimeKind.Utc

  • 夏天,俄罗斯,DateTimeKind.Local

  • 冬天,基辅,DateTimeKind.Utc

  • 冬天,基辅,DateTimeKind.Local

  • 夏天,基辅,DateTimeKind.Utc

  • 夏天,基辅,DateTimeKind.Local

  • 我的电脑时间是(UTC + 00:00)伦敦+1小时(现在是DayLight节省时间)。
    在我的测试中,我使用时间15:00。
    让它变量dst = 1小时(对于我当地的DayLight节省时间),我想知道为什么我得到这个ouptut:

  • 在俄罗斯UTC + 3,所以15:00utc + 3 = 18:00
  • 在俄罗斯UTC + 3,所以15:00local + 3 = 18:00(dst * 0,因为它是冬天)
  • 在俄罗斯UTC + 3,所以15:00utc + 3 = 18:00
  • 为什么是17:00 ??? (如何计算?)
  • 在基辅UTC + 2,所以15:00utc + 2 = 17:00
  • 在基辅UTC + 2,所以15:00local + 2 = 17:00
  • 为什么是18:00 ??? (如何计算?)
  • 为什么是17:00 ??? (如何计算?)
  • Windows 7的

    时区:(UTC + 00:00)都柏林,爱丁堡,里斯本,伦敦。

    文化:英国

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    DateTime time = TimeZoneInfo.ConvertTime(new DateTime(2018, 11, 23, 15, 0, 0, DateTimeKind.Utc),
         TimeZoneInfo.FindSystemTimeZoneById("Russian Standard Time"));
     Console.WriteLine(time);

     time = TimeZoneInfo.ConvertTime(new DateTime(2018, 11, 23, 15, 0, 0, DateTimeKind.Local),
         TimeZoneInfo.FindSystemTimeZoneById("Russian Standard Time"));
     Console.WriteLine(time);

     time = TimeZoneInfo.ConvertTime(new DateTime(2018, 8, 2, 15, 0, 0, DateTimeKind.Utc),
        TimeZoneInfo.FindSystemTimeZoneById("Russian Standard Time"));
     Console.WriteLine(time);

     time = TimeZoneInfo.ConvertTime(new DateTime(2018, 8, 2, 15, 0, 0, DateTimeKind.Local),
         TimeZoneInfo.FindSystemTimeZoneById("Russian Standard Time"));
     Console.WriteLine(time);

     time = TimeZoneInfo.ConvertTime(new DateTime(2018, 11, 23, 15, 0, 0, DateTimeKind.Utc),
         TimeZoneInfo.FindSystemTimeZoneById("FLE Standard Time"));
     Console.WriteLine(time);

     time = TimeZoneInfo.ConvertTime(new DateTime(2018, 11, 23, 15, 0, 0, DateTimeKind.Local),
         TimeZoneInfo.FindSystemTimeZoneById("FLE Standard Time"));
     Console.WriteLine(time);

     time = TimeZoneInfo.ConvertTime(new DateTime(2018, 8, 2, 15, 0, 0, DateTimeKind.Utc),
        TimeZoneInfo.FindSystemTimeZoneById("FLE Standard Time"));
     Console.WriteLine(time);

     time = TimeZoneInfo.ConvertTime(new DateTime(2018, 8, 2, 15, 0, 0, DateTimeKind.Local),
         TimeZoneInfo.FindSystemTimeZoneById("FLE Standard Time"));
     Console.WriteLine(time);

    enter image description here


    因为时区"伦敦"不是UTC + 0。 冬天只有UTC + 0,夏天只有UTC + 1。

    如果您将日期转换为"FLE",请以UTC显示,您将看到我的意思。

    例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    var fleTimeZone = TimeZoneInfo.FindSystemTimeZoneById("FLE Standard Time");
    var local = new DateTime(2018, 8, 2, 15, 0, 0, DateTimeKind.Local);
    var utc = local.ToUniversalTime();
    var fle = TimeZoneInfo.ConvertTime(local, fleTimeZone);

    Console.WriteLine(TimeZoneInfo.Local);
    Console.WriteLine(TimeZoneInfo.Local +":" + local);
    Console.WriteLine(TimeZoneInfo.Utc +":" + utc);
    Console.WriteLine(fleTimeZone +":" + fle);

    (UTC+00:00) Dublin, Edinburgh, Lissabon, London

    (UTC+00:00) Dublin, Edinburgh, Lissabon, London: 02.08.2018 15:00:00

    UTC: 02.08.2018 14:00:00

    (UTC+02:00) Helsinki, Kiew, Riga, Sofia, Tallinn, Wilna: 02.08.2018 17:00:00


    正如nvoigt解释的那样,伦敦的夏令时(称为BST)是UTC + 1。 使用DateTimeKind.Local时,该值对于您的计算机是本地的。

    因此,要完成您的图表:

    4)伦敦是UTC + 1(BST)所以15:00 BST = 14:00 UTC。 俄罗斯是UTC + 3,所以14:00 + 3 = 17:00

    7)UTC时间15:00 基辅是UTC + 3(EEST),所以15:00 + 3 = 18:00

    8)伦敦是UTC + 1(BST)所以15:00 BST = 14:00 UTC。 基辅是UTC + 3,所以14:00 + 3 = 17:00

    所有计算都按预期工作。