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:
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); |
因为时区"伦敦"不是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。 使用
因此,要完成您的图表:
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
所有计算都按预期工作。