根据DayLight节省时间,将datetime(本地或utc)转换为莫斯科和基辅时区问题

时间:2018-04-26 14:16:36

标签: c# datetime utc dst

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

据我所知,.NET TimeZoneInfo from Olson time zone莫斯科使用俄罗斯标准时间,而基辅(乌克兰)使用FLE标准时间。

我的测试是:

  1. 冬天,俄罗斯,DateTimeKind.Utc

  2. 冬天,俄罗斯,DateTimeKind.Local

  3. 夏天,俄罗斯,DateTimeKind.Utc

  4. 夏天,俄罗斯,DateTimeKind.Local

  5. 冬天,基辅,DateTimeKind.Utc

  6. Winter,Kiev,DateTimeKind.Local

  7. 夏天,基辅,DateTimeKind.Utc

  8. 夏天,基辅,DateTimeKind.Local

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

    1. 在俄罗斯UTC + 3,所以15:00utc + 3 = 18:00
    2. 在俄罗斯UTC + 3,所以15:00本地+3 = 18:00(dst * 0,因为它是冬天)
    3. 在俄罗斯UTC + 3,所以15:00utc + 3 = 18:00
    4. 为什么是17:00 ??? (如何计算?)
    5. 在基辅UTC + 2,所以15:00utc + 2 = 17:00
    6. 在基辅UTC + 2,所以15:00local + 2 = 17:00
    7. 为什么是18:00 ??? (如何计算?)
    8. 为什么是17:00 ??? (如何计算?)
    9. Windows 7

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

      文化:英国

      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

2 个答案:

答案 0 :(得分:2)

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

如果你把你的日期转换为" FLE",用UTC显示它们,你会看到我的意思。

示例:

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)都柏林,爱丁堡,Lissabon,伦敦

     

(UTC + 00:00)都柏林,爱丁堡,Lissabon,伦敦: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

答案 1 :(得分:1)

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

因此,要完成你的图表:

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

7)15:00 UTC。基辅是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

所有计算都按预期工作。