ومرة أخرى حول "معلومات المنطقة الزمنية غير الصحيحة للمناطق الزمنية الروسية" [.net bug، ID: 693286]

مساء الخير ، زملائي ، سارعت إلى مشاركة المشكلة التي نشأت أثناء دمج خدمات جافا و. net. من أجل الوضوح ، سأعطيك مثالاً: خدمة Net تقرأ البيانات من النوع Date من قاعدة البيانات ، وتحولها إلى طويلة ، ثم تنقلها إلى جانب عميل Java ، حيث يتم إنشاء نسخة java.util.Date كاملة من فترة طويلة. سيكون كل شيء على ما يرام حتى بدأنا في قراءة البيانات التاريخية ، أي البيانات قبل الإلغاء الشهير للانتقال إلى فصل الشتاء أو بالفعل هناك. تنقل خدمة .Net (في المنطقة الزمنية الروسية) التاريخ (أو بشكل أكثر دقة تشكل فترة طويلة) لـ "01/01/2010 13:00:00" ، وعلى جانب جافا ، يتم إنشاء مثيل java.util.Date كـ "01/01 / 2010 12:00:00 ". من أين يأتي هذا الاختلاف غير المفهوم في الساعة ؟! نبدأ في استكشاف.

لذا ، كود Java:
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


مليان ، واو ؟! أي أن تحول المنطقة الزمنية هو نفسه "قبل" و "بعد". استمر في البحث عنه والبحث عن :

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 framework. بدلاً من ذلك ، يرجع ذلك إلى تحديث نظام التشغيل الذي أثر على بيانات التسجيل التي تصف بعض المناطق الزمنية الروسية. الخلفية هي أن روسيا قد غيرت مناطقها الزمنية ، بالإضافة إلى تعويضات قاعدتها وقواعد التوقيت الصيفي في نفس العام.


وكيف لدي نظام التشغيل Windows 7 ، ولدي أحدث حزم الخدمات وأحدث إصدار من .Net ، وما زال الخطأ الذي تم اكتشافه في عام 2011 لم يتم حله ؟! حسنًا ، هذا كل شيء (أنا أتحدث عن العواء وأن كل شيء يعمل في Java يعمل "كما ينبغي") ... فقط ضع هذا الخطأ في الاعتبار عند قراءة البيانات التاريخية.

All Articles