2008-10-06 13:54:45

6-й день

Про работу PHP

С началом октября появилась проблема 6-го дня в php (наблюдается на php-4.4.8  win32 и 4.x на linux, на других платформах эксперименты не проводились). Ее можно назвать реинкарнацией проблемы 2000 года.

Суть проблемы заключается в косяке в php-шных функциях  работы со временем, результатом которой является неверное исчисление времени для октября 2008. Сентябрь, ноябрь и декабрь (дальше не проверялось) без проблем.

Более подробно видно из примера:


Создаем скрипт, который выводит каждый день месяца с его порядковым номером.

<?php
$start = mktime(0, 0, 0, 10, 1, 2008); // 01.10.2008
 $end = mktime(0, 0, 0, 11, 1, 2008); // 01.11.2008
 $day = 60*60*24; // в дне 86400 секунд
 
 $cnt = 0;
 for($i=$start; $i<$end; $i+=$day) // в прямом порядке
 {
  echo sprintf("%02d> %s
", ++$cnt, date("Y-m-d H:i:s", $i));
 }

 echo "---";

 $cnt = 0;
 for($i=$end; $i>$start; $i-=$day) // в обратном порядке
 {
  echo sprintf("%02d> %s
", ++$cnt, date("Y-m-d H:i:s", $i));
 }
?>

Результатом выполнения скрипта будет вот такая штука:

01> 2008-10-01 00:00:00
02> 2008-10-02 00:00:00
03> 2008-10-03 00:00:00
04> 2008-10-04 00:00:00
05> 2008-10-05 00:00:00
06> 2008-10-06 00:00:00
07> 2008-10-07 00:00:00
08> 2008-10-08 00:00:00
09> 2008-10-09 00:00:00
10> 2008-10-10 00:00:00
11> 2008-10-11 00:00:00
12> 2008-10-12 00:00:00
13> 2008-10-13 00:00:00
14> 2008-10-14 00:00:00
15> 2008-10-15 00:00:00
16> 2008-10-16 00:00:00
17> 2008-10-17 00:00:00
18> 2008-10-18 00:00:00
19> 2008-10-19 00:00:00
20> 2008-10-20 00:00:00
21> 2008-10-21 00:00:00
22> 2008-10-22 00:00:00
23> 2008-10-23 00:00:00
24> 2008-10-24 00:00:00
25> 2008-10-25 00:00:00
26> 2008-10-26 00:00:00
27> 2008-10-26 23:00:00
28> 2008-10-27 23:00:00
29> 2008-10-28 23:00:00
30> 2008-10-29 23:00:00
31> 2008-10-30 23:00:00
32> 2008-10-31 23:00:00

01> 2008-11-01 00:00:00
02> 2008-10-31 00:00:00
03> 2008-10-30 00:00:00
04> 2008-10-29 00:00:00
05> 2008-10-28 00:00:00
06> 2008-10-27 00:00:00
07> 2008-10-26 01:00:00
08> 2008-10-25 01:00:00
09> 2008-10-24 01:00:00
10> 2008-10-23 01:00:00
11> 2008-10-22 01:00:00
12> 2008-10-21 01:00:00
13> 2008-10-20 01:00:00
14> 2008-10-19 01:00:00
15> 2008-10-18 01:00:00
16> 2008-10-17 01:00:00
17> 2008-10-16 01:00:00
18> 2008-10-15 01:00:00
19> 2008-10-14 01:00:00
20> 2008-10-13 01:00:00
21> 2008-10-12 01:00:00
22> 2008-10-11 01:00:00
23> 2008-10-10 01:00:00
24> 2008-10-09 01:00:00
25> 2008-10-08 01:00:00
26> 2008-10-07 01:00:00
27> 2008-10-06 01:00:00
28> 2008-10-05 01:00:00
29> 2008-10-04 01:00:00
30> 2008-10-03 01:00:00
31> 2008-10-02 01:00:00
32> 2008-10-01 01:00:00

Красным отмечена кривизна. Плюс к тому что время съезжает на час, после 6-го дня, так еще и в октябре из-за этого получается 32 дня.

Странно, что ссылок и упоминаний о подобной ситуации пока нигде не встретил.