Ошибка приращения метрики php?

У меня есть функция разбиения на страницы, которая позволяет просматривать страницы по расписанию и выводит даты на еженедельной основе и отображает сведения, относящиеся к новым датам.

Во время тестирования некоторых новых данных я столкнулся с проблемой поискового вызова. В том, что он не будет проходить 22/10/2012.

Отладка кода В конце концов я нашел источник проблемы, который заключается в том, что приращение штампа даты, представляющего 22/10/2012 на 7 дней, возвращено (через strftime) датой 28/10/2012, когда, очевидно, я ожидал дату 29 / 10/2012. Эта ошибка, фактически вызывающая непрерывный цикл в виде% W (который ведет еженедельную разбивку на страницы), составляет 43 на 22/10/2012 и 43 на 28/10/2012, и, конечно, это должно быть 44 за 29/10/2012.

В ходе быстрого теста, чтобы изолировать и воссоздать эту проблему, я использовал следующее:

/* * test %W */ $time_Stamp_1 = mktime(0,0,0,10,22,2012); echo "date : " . strftime("%d/%m/%Y", $time_Stamp_1); echo "W for first time stamp " . $time_Stamp_1 . " is " . strftime("%W", $time_Stamp_1); $time_Stamp_1a = $time_Stamp_1 += (60 * 60 * 24 * 7); echo "new date : " . strftime("%d/%m/%Y", $time_Stamp_1a); echo "W for new date time stamp: " . strftime("%W", $time_Stamp_1a); $time_Stamp_2 = mktime(0,0,0,10,29,2012); echo "W for second time stamp: " . strftime("%W", $time_Stamp_2); 

Цепочка страницы счастливо перемещается между всеми оставшимися неделями, которые я тестировал, и, очевидно, использует этот приращение / декремент.

Надеюсь, я упустил что-то очевидное. Есть предположения?

Класс PHP DateTime – это способ: –

 $inFormat = 'd/m/Y h:i'; $outFormat = 'd/m/Y'; $date = DateTime::createFromFormat($inFormat, '22/10/2012 00:00'); $interval = new DateInterval('P7D'); for($i = 0; $i < 10; $i++){ $date->add($interval); var_dump($date->format($outFormat) . " is in week " . $date->format('W'));week'); } - $inFormat = 'd/m/Y h:i'; $outFormat = 'd/m/Y'; $date = DateTime::createFromFormat($inFormat, '22/10/2012 00:00'); $interval = new DateInterval('P7D'); for($i = 0; $i < 10; $i++){ $date->add($interval); var_dump($date->format($outFormat) . " is in week " . $date->format('W'));week'); } 

Дает следующий результат:

 string '29/10/2012 is in week 44' (length=24) string '05/11/2012 is in week 45' (length=24) string '12/11/2012 is in week 46' (length=24) string '19/11/2012 is in week 47' (length=24) string '26/11/2012 is in week 48' (length=24) string '03/12/2012 is in week 49' (length=24) string '10/12/2012 is in week 50' (length=24) string '17/12/2012 is in week 51' (length=24) string '24/12/2012 is in week 52' (length=24) string '31/12/2012 is in week 01' (length=24) 

Который, быстрый взгляд на календарь говорит мне, является правильным.

См. Здесь правильные строки формата http://us.php.net/manual/en/datetime.createfromformat.php
Также см. Класс DateInterval .

См. Здесь для допустимых форматов вывода для DateTime :: format () http://us.php.net/manual/en/function.date.php

Или еще лучше использовать DateTime .

  // Create the DateTime object $date = new DateTime('2012-22-10'); echo $date->format('d/m/Y'); // Add one week $date->modify('+1 week'); echo $date->format('d/m/Y'); 

Попробуйте использовать strtotime () для расчета времени – например, чтобы использовать следующую неделю:

 $time_Stamp_1a = strtotime("+1 week", $time_Stamp_1);