среда, 15 октября 2014 г.

Неодинаковое поведение Date и TimeZone в разных браузерах (IE, Firefox, Chrome)

Я решил проверить, как браузеры учитывают переход на летнее время.
В сентябре 2014 года Microsoft выпустила обновление часовых поясов для России KB 2998527.
В Линуксе для Москвы учтены переходы 28 марта 2010, 31 октября 2010, 27 марта 2011 и 26 октября 2014:

/usr/share/zoneinfo/Europe/Moscow  Sat Mar 27 22:59:59 2010 UTC = Sun Mar 28 01:59:59 2010 MSK isdst=0 gmtoff=10800
/usr/share/zoneinfo/Europe/Moscow  Sat Mar 27 23:00:00 2010 UTC = Sun Mar 28 03:00:00 2010 MSD isdst=1 gmtoff=14400
/usr/share/zoneinfo/Europe/Moscow  Sat Oct 30 22:59:59 2010 UTC = Sun Oct 31 02:59:59 2010 MSD isdst=1 gmtoff=14400
/usr/share/zoneinfo/Europe/Moscow  Sat Oct 30 23:00:00 2010 UTC = Sun Oct 31 02:00:00 2010 MSK isdst=0 gmtoff=10800
/usr/share/zoneinfo/Europe/Moscow  Sat Mar 26 22:59:59 2011 UTC = Sun Mar 27 01:59:59 2011 MSK isdst=0 gmtoff=10800
/usr/share/zoneinfo/Europe/Moscow  Sat Mar 26 23:00:00 2011 UTC = Sun Mar 27 03:00:00 2011 MSK isdst=0 gmtoff=14400
/usr/share/zoneinfo/Europe/Moscow  Sat Oct 25 21:59:59 2014 UTC = Sun Oct 26 01:59:59 2014 MSK isdst=0 gmtoff=14400
/usr/share/zoneinfo/Europe/Moscow  Sat Oct 25 22:00:00 2014 UTC = Sun Oct 26 01:00:00 2014 MSK isdst=0 gmtoff=10800
Написал скрипт, который выводит даты после перевода часов, начиная с марта 2010 года в течение 6 лет.

<!DOCTYPE html>
<html>
<head>
 <script type="text/javascript">
  function f1() {
   var gmt = "GMT+0300";
   var day = 24*60*60*1000;
   var date = new Date(2010, 2, 1);
   var ms = date.getTime();
   var s = date.toString() + " " + date.toLocaleDateString();
   for (var i=0; i<6*365; i++) {
     ms += day;
     date = new Date(ms);
     var gmt_ = date.toString().match(/GMT.\d+/).toString();
     if (gmt_ != gmt) {
       s += "<br/>" + date.toString() + " " + date.toLocaleDateString();
    gmt = gmt_;
     }
   }
   document.getElementById("main").innerHTML  = s;
  }
 </script>
</head>
<body onload="f1();">
  <div id="main"></div>
</body>
</html>
Mozilla Firefox 31.1.0 (Oracle Linux 6.5) работает безупречно:

Mon Mar 01 2010 00:00:00 GMT+0300 (MSK) 01.03.2010
Mon Mar 29 2010 01:00:00 GMT+0400 (MSD) 29.03.2010
Mon Nov 01 2010 00:00:00 GMT+0300 (MSK) 01.11.2010
Mon Mar 28 2011 01:00:00 GMT+0400 (MSK) 28.03.2011
Mon Oct 27 2014 00:00:00 GMT+0300 (MSK) 27.10.2014
Internet Explorer 11 (Windows 7) тоже работает безупречно:

Mon Mar 01 2010 00:00:00 GMT+0300 (RTZ 2 (зима)) ‎01‎.‎03‎.‎2010
Mon Mar 29 2010 01:00:00 GMT+0400 (RTZ 2 (лето)) ‎29‎.‎03‎.‎2010
Mon Nov 01 2010 00:00:00 GMT+0300 (RTZ 2 (зима)) ‎01‎.‎11‎.‎2010
Mon Mar 28 2011 01:00:00 GMT+0400 (RTZ 2 (лето)) ‎28‎.‎03‎.‎2011
Mon Oct 27 2014 00:00:00 GMT+0300 (RTZ 2 (зима)) ‎27‎.‎10‎.‎2014
Google Chrome 33.0.1750.154 (Windows 7) не знает, что с 2011 года перевод времени отменён (за исключением 2014 года). И на летнее время переходит в январе:

Mon Mar 01 2010 00:00:00 GMT+0400 (RTZ 2 (лето)) 28.2.2010
Tue Mar 02 2010 00:00:00 GMT+0400 (RTZ 2 (лето)) 1.3.2010
Sun Oct 31 2010 23:00:00 GMT+0300 (RTZ 2 (зима)) 31.10.2010
Thu Jan 06 2011 00:00:00 GMT+0400 (RTZ 2 (лето)) 5.1.2011
Sun Oct 30 2011 23:00:00 GMT+0300 (RTZ 2 (зима)) 31.10.2011
Thu Jan 05 2012 00:00:00 GMT+0400 (RTZ 2 (лето)) 5.1.2012
Sun Oct 28 2012 23:00:00 GMT+0300 (RTZ 2 (зима)) 29.10.2012
Thu Jan 03 2013 00:00:00 GMT+0400 (RTZ 2 (лето)) 3.1.2013
Sun Oct 27 2013 23:00:00 GMT+0300 (RTZ 2 (зима)) 28.10.2013
Thu Jan 02 2014 00:00:00 GMT+0400 (RTZ 2 (лето)) 2.1.2014
Sun Oct 26 2014 23:00:00 GMT+0300 (RTZ 2 (зима)) 27.10.2014
Thu Jan 08 2015 00:00:00 GMT+0400 (RTZ 2 (лето)) 8.1.2015
Sun Oct 25 2015 23:00:00 GMT+0300 (RTZ 2 (зима)) 26.10.2015
Thu Jan 07 2016 00:00:00 GMT+0400 (RTZ 2 (лето)) 7.1.2016
Mozilla Firefox 26.0 (Windows 7) тоже сильно ошибается:

Mon Mar 01 2010 00:00:00 GMT+0400 1 Март 2010 г.
Tue Mar 02 2010 00:00:00 GMT+0400 2 Март 2010 г.
Sun Oct 31 2010 23:00:00 GMT+0300 31 Октябрь 2010 г.
Thu Jan 06 2011 00:00:00 GMT+0400 6 Январь 2011 г.
Sun Oct 30 2011 23:00:00 GMT+0300 30 Октябрь 2011 г.
Thu Jan 05 2012 00:00:00 GMT+0400 5 Январь 2012 г.
Sun Oct 28 2012 23:00:00 GMT+0300 28 Октябрь 2012 г.
Thu Jan 03 2013 00:00:00 GMT+0400 3 Январь 2013 г.
Sun Oct 27 2013 23:00:00 GMT+0300 27 Октябрь 2013 г.
Thu Jan 02 2014 00:00:00 GMT+0400 2 Январь 2014 г.
Sun Oct 26 2014 23:00:00 GMT+0300 26 Октябрь 2014 г.
Thu Jan 08 2015 00:00:00 GMT+0400 8 Январь 2015 г.
Sun Oct 25 2015 23:00:00 GMT+0300 25 Октябрь 2015 г.
Thu Jan 07 2016 00:00:00 GMT+0400 7 Январь 2016 г.
Так что объект Date ведет себя неодинаково на разных платформах. Им нужно пользоваться с большой осторожностью, а лучше найти ему замену.

Комментариев нет:

Отправить комментарий