Комментарии 6
А нельзя вместо long передавать дату в ISO 8601?
Насколько я помню, в Windows система часовых поясов попросту изначально не предполагала возможности иметь несколько исторических вариантов для одной географической зоны и, соответственно, если время указано в RTZ2, то никаких его коррекций в случае, если дата до введения этой зоны, не производится. В отличие от Linux, да.
P.S. и да, в системных жураналах событий Windows эта проблема «в полный рост».
P.S. и да, в системных жураналах событий Windows эта проблема «в полный рост».
Каким образом число в лонге учитывает (кодирует) таймзону?
Windows 10, код на c# вернул правильно:
Before Medvedev tricks: 3
After Medvedev tricks: 4
Для чего-то чувствительного ко времени рекомендую использовать библиотеку NodaTime. Там своя база часовых поясов и они не привязаны к ОС. Ваш код тогда будет выглядеть вот так:
static void Main(string[] args)
{
DateTimeZone tzMoscow = DateTimeZoneProviders.Tzdb["Europe/Moscow"];
DateTimeZone tzLondon = DateTimeZoneProviders.Tzdb["Europe/London"];
System.Diagnostics.Debug.WriteLine("Before Medvedev tricks: " + calcTimeZoneShift(tzLondon, tzMoscow, "2010-01-01T13:00:00Z"));
System.Diagnostics.Debug.WriteLine("After Medvedev tricks: " + calcTimeZoneShift(tzLondon, tzMoscow, "2013-01-01T13:00:00Z"));
}
private static long calcTimeZoneShift(DateTimeZone tz1, DateTimeZone tz2, String time)
{
var date1 = InstantPattern.ExtendedIso.Parse(time).Value.InZone(tz1);
var date2 = InstantPattern.ExtendedIso.Parse(time).Value.InZone(tz2);;
return (date2.Offset - date1.Offset).Seconds / 3600;
}
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
И снова об «Incorrect time zone information for Russian time zones » [.Net bug, ID: 693286]