有一些时区切换到DayLight节省时间而不是。我知道俄罗斯不会转向这一次,而乌克兰则转向DayLight节省时间。
据我所知,.NET TimeZoneInfo from Olson time zone莫斯科使用俄罗斯标准时间,而基辅(乌克兰)使用FLE标准时间。
我的测试是:
冬天,俄罗斯,DateTimeKind.Utc
冬天,俄罗斯,DateTimeKind.Local
夏天,俄罗斯,DateTimeKind.Utc
夏天,俄罗斯,DateTimeKind.Local
冬天,基辅,DateTimeKind.Utc
Winter,Kiev,DateTimeKind.Local
夏天,基辅,DateTimeKind.Utc
夏天,基辅,DateTimeKind.Local
我的电脑时间是(UTC + 00:00)伦敦 +1 小时(现在是DayLight节省时间)。 在我的测试中,我使用时间15:00。 让它变量dst = 1小时(对于我当地的DayLight节省时间),我想知道为什么我得到这个ouptut:
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);
答案 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
所有计算都按预期工作。