рдФрд░ рдлрд┐рд░ рд╕реЗ "рд░реВрд╕реА рд╕рдордп рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА" [.Net рдмрдЧ, рдЖрдИрдбреА: 693286]

рд╢реБрдн рджреЛрдкрд╣рд░, рд╕рд╛рдерд┐рдпреЛрдВ, рдореИрдВ рдЬрд╛рд╡рд╛ рдФрд░ .Net рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдПрдХреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рдЙрддреНрдкрдиреНрди рд╣реБрдИ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреА рдЬрд▓реНрджрдмрд╛рдЬреА рдХрд░рддрд╛ рд╣реВрдВред рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛: .Net рд╕реЗрд╡рд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЯрд╛рдЗрдк рдбреЗрдЯ рдХрд╛ рдбреЗрдЯрд╛ рдкрдврд╝рддреА рд╣реИ, рдЗрд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд░рддреА рд╣реИ, рдлрд┐рд░ рдЗрд╕реЗ рдЬрд╛рд╡рд╛ рдЙрдкрднреЛрдХреНрддрд╛ рдкрдХреНрд╖ рдореЗрдВ рднреЗрдЬрддреА рд╣реИ, рдЬрд╣рд╛рдВ рдПрдХ рдкреВрд░реНрдг java.util.Date рдЙрджрд╛рд╣рд░рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдм рддрдХ рд╣рдо рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рдирд╛ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рддрдм рддрдХ рд╕рдмрдХреБрдЫ рдареАрдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдпрд╛рдиреА рдХрд┐ рд╡рд┐рдВрдЯрд░-рдпрд╛-рдкрд╣рд▓реЗ рд╕реЗ рд╣реА-рд╕рдордп рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛ рдбреЗрдЯрд╛ред .Net рд╕реЗрд╡рд╛ (рд░реВрд╕реА рд╕рдордп-рдХреНрд╖реЗрддреНрд░ рдореЗрдВ) "01/01/2010 13:00:00" рдХреЗ рд▓рд┐рдП рджрд┐рдирд╛рдВрдХ (рдпрд╛ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдПрдХ рд▓рдВрдмрд╛ рд░реВрдк) рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рддреА рд╣реИ, рдФрд░ рдЬрд╛рд╡рд╛ рдкрдХреНрд╖ рдкрд░, рдПрдХ java.util.Date рдЙрджрд╛рд╣рд░рдг "01/01 /" рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред 2010 12:00:00 " рдПрдХ рдШрдВрдЯреЗ рдореЗрдВ рдпрд╣ рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рдЕрдВрддрд░ рдХрд╣рд╛рдБ рд╕реЗ рдЖрддрд╛ рд╣реИ? рд╣рдо рддрд▓рд╛рд╢рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рддреЛ, рдЬрд╛рд╡рд╛ рдХреЛрдб:
public class Main {

    public static void main(String[] args) throws ParseException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
        TimeZone tzMoscow = TimeZone.getTimeZone("Europe/Moscow");
        TimeZone tzLondon = TimeZone.getTimeZone("Europe/London");

        System.out.println("Before Medvedev tricks: " + calcTimeZoneShift(tzLondon, tzMoscow, "2010-01-01T13:00:00", format));
        System.out.println("After Medvedev tricks: " + calcTimeZoneShift(tzLondon, tzMoscow, "2013-01-01T13:00:00", format));
    }

    static private long calcTimeZoneShift(TimeZone tz1, TimeZone tz2, String time, SimpleDateFormat format)
            throws ParseException{

        format.setTimeZone(tz1);
        Date date1 = format.parse(time);

        format.setTimeZone(tz2);
        Date date2 = format.parse(time);
        return (date1.getTime() - date2.getTime())/3600000;

    };

}

Output:
Before Medvedev tricks: 3
After Medvedev tricks: 4


рд╕рдм рдХреБрдЫ рд╕рдЪ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ: рдореЗрджрд╡реЗрджреЗрд╡ рд╕реЗ рдкрд╣рд▓реЗ, рд▓рдВрджрди рдХреЗ рд╕рд╛рде рд╕рд░реНрджрд┐рдпреЛрдВ рдФрд░ рдЧрд░реНрдорд┐рдпреЛрдВ рдореЗрдВ рдЕрдВрддрд░ 3 рдмрдЬреЗ рдерд╛, рд▓реЗрдХрд┐рди рдореЗрджрд╡реЗрджреЗрд╡ рдХреЗ рдмрд╛рдж рд╕рд░реНрджрд┐рдпреЛрдВ рдореЗрдВ рдЕрдВрддрд░ рдкрд╣рд▓реЗ рд╣реА 4 рдШрдВрдЯреЗ рдерд╛ред

рд╣рдореЗрдВ рдХреНрдпрд╛ рдЖрд╢реНрдЪрд░реНрдп рд╣реЛрдЧрд╛ред рдиреЗрдЯ:

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            
            TimeZoneInfo tzMoscow = TimeZoneInfo.FindSystemTimeZoneById("Russian Standard Time");
            TimeZoneInfo tzLondon = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
            
            System.Diagnostics.Debug.WriteLine("Before Medvedev tricks: " + calcTimeZoneShift(tzLondon, tzMoscow, "01/01/2010 13:00:00"));
            System.Diagnostics.Debug.WriteLine("After Medvedev tricks: " + calcTimeZoneShift(tzLondon, tzMoscow, "01/01/2013 13:00:00"));

        }

        private static long calcTimeZoneShift(TimeZoneInfo tz1, TimeZoneInfo tz2, String time)
        {
            DateTime date = DateTime.Parse(time);
            DateTime newTime = TimeZoneInfo.ConvertTime(date, tz1, tz2);
            return (newTime.ToFileTimeUtc() - date.ToFileTimeUtc()) / 36000000000;
        }

    }
}

Output:
Before Medevedev tricks: 4
After Medevedev tricks: 4


Mliiin, рд╡рд╛рд╣ ?! рдпрд╣реА рд╣реИ, рдЯрд╛рдЗрдордЬрд╝реЛрди рд╢рд┐рдлреНрдЯ "рдкрд╣рд▓реЗ" рдФрд░ "рдмрд╛рдж" рдХреЗ рд╕рдорд╛рди рд╣реИред рдЗрд╕реЗ рдЬрд╛рд░реА рд░рдЦреЗрдВ рдФрд░ рдвреВрдВрдвреЗрдВ :

Incorrect time zone information for Russian time zones by

Type: Bug
ID: 693286
Opened: 10/5/2011 8:18:45 PM
Access Restriction: Public
Moderator Decision: Sent to Engineering Team for consideration

Time zone information for Russian time zones is incorrect. I think this occurs after Russian government disable summer time. Issue occurs then I converting date in the past from UST time zone to one of Russian time zones using routine TimeZoneInfo.ConvertTimeFromUtc
Actual results
UTC 13.06.2010 00:00:00 = Moscow 13.06.2010 5:00:00
UTC 13.12.2010 00:00:00 = Moscow 13.12.2010 4:00:00

Expected results
UTC 13.06.2010 00:00:00 = Moscow 13.06.2010 4:00:00
UTC 13.12.2010 00:00:00 = Moscow 13.12.2010 3:00:00


рд╣рдордиреЗ рдЬрд╡рд╛рдм рдкрдврд╝рд╛:

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╕рдорд╕реНрдпрд╛ .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рдУрдПрд╕ рдЕрдкрдбреЗрдЯ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдХреБрдЫ рд░реВрд╕реА рд╕рдордп рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рдкреГрд╖реНрдарднреВрдорд┐ рдпрд╣ рд╣реИ рдХрд┐ рд░реВрд╕ рдиреЗ рдЕрдкрдиреЗ рд╕рдордп рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЙрдирдХреЗ рдЖрдзрд╛рд░ рдХрд╛рд░реНрдпрд╛рд▓рдп рдФрд░ рдбреАрдПрд╕рдЯреА рдирд┐рдпрдо рд╕рднреА рдПрдХ рд╣реА рд╡рд░реНрд╖ рдореЗрдВ рд╣реИрдВред


рдФрд░ рдпрд╣ рдХреИрд╕реЗ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд┐рдВрдбреЛрдЬ 7 рд╣реИ, рдореЗрд░реЗ рдкрд╛рд╕ рд╕рднреА рдирд╡реАрдирддрдо рд╕рд░реНрд╡рд┐рд╕ рдкреИрдХ рдФрд░ .Net рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рдФрд░ рдЕрднреА рднреА 2011 рдореЗрдВ рдкрд╛рдИ рдЧрдИ рддреНрд░реБрдЯрд┐ рдЕрднреА рднреА рд╣рд▓ рдирд╣реАрдВ рд╣реБрдИ рд╣реИ?! рдареАрдХ рд╣реИ, рд╡рд╣ рд╕рдм (рдореИрдВ рдХреИрд╕реЗ рд╣реЛрд▓реНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рд╡рд╣ рд╕рдм рдХреБрдЫ "рдЬреИрд╕рд╛ рдХрд┐ рдЬрд╛рд╡рд╛ рдореЗрдВ" рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ... рдмрд╕ рдЗрддрдирд╛ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рдбреЗрдЯрд╛ рдирд╣реАрдВ рдкрдврд╝рддреЗ рд╕рдордп рдЗрд╕ рдмрдЧ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗрдВред

All Articles