首页 文章

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

提问于
浏览
0

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

据我所知,从这个链接.NET TimeZoneInfo from Olson time zone莫斯科使用俄罗斯标准时间和基辅(乌克兰)使用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:00本地3 = 18:00(dst * 0,因为它是冬天)

  • 在俄罗斯UTC 3,所以15:00utc 3 = 18:00

  • Why it is 17:00 ??? (如何计算?)

  • 在基辅UTC 2,所以15:00utc 2 = 17:00

  • 在基辅UTC 2,所以15:00local 2 = 17:00

  • Why it is 18:00 ??? (如何计算?)

  • Why it is 17:00 ??? (如何计算?)

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 回答

  • 2

    正如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

    所有计算都按预期工作 .

  • 1

    因为时区"London"不是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)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)赫尔辛基,Kiew,里加,索菲亚,塔林,Wilna:02.08.2018 17:00:00

相关问题