2012-01-06 3 views
2
$startDay = "2011-03-31"; 

for($i=0; $i<6; $i++) 
{ 
    $startDaysArr[] = date("Y-m-d", strtotime($startDay) - 3600*24*$i); 

} 

$startDaysArr = array_reverse($startDaysArr, FALSE); 

Duo для часов двигаться вперед один час на 2011-03-27, поэтому выход не исправить, когда $startDay = "2011-03-31 00:00:00" после выполнения кода.Ошибка при отображении даты марта 2011

Как видно из приведенного ниже результата, 2011-03-27 отсутствует. Кто-нибудь может мне помочь? Очень ценю за вашу помощь.

----- Выход Когда $ startDaysArr = "2011-03-31 00:00:00" ----

Array       //Correct One: 
(
    [25] => 2011-03-25   // 2011-03-26 
    [26] => 2011-03-26   // 2011-03-27 
    [27] => 2011-03-28   // 2011-03-28 
    [28] => 2011-03-29   // 2011-03-29 
    [29] => 2011-03-30   // 2011-03-30 
    [30] => 2011-03-31   // 2011-03-31 
) 
+0

Что происходит, если вы начинаете с «2011-03-31 01:00:00», ? – Elorfin

ответ

2

Работа с полудня, а не в полночь:

$startDay = "2011-03-31"; 
$currDay = $startDay; 
for($i = 0; $i < 6; $i++) { 
    $startDaysArr[] = $currDay; 
    $currDay = date ("Y-m-d", strtotime ($currDay . " 11:59") - 3600 * 24 * $i); 
} 

Таким образом, изменения в течение часа или около того не будут иметь никакого эффекта. Тот факт, что вы только сохраняете компонент даты и используете его в сочетании с временем 11:59, означает, что вычитание в 24 часа должно быть безопасным (без кумулятивных ошибок).

0

Когда смещение часов является большой проблемой, почему бы не добавить безопасное время до даты?

$ startDay = "2011-03-31 7:00";

Функция strtotime ожидает, что будет задана строка, содержащая формат даты на английском языке, и попытается проанализировать этот формат в метке времени Unix.

0

Почему вы не используете только функцию strtotime? Измените эту строку:

$startDaysArr[] = date("Y-m-d", strtotime("$startDay -$i day")); 
1

Почти идентична другой вопрос я уже ответил сегодня:

$startDaysArr = array(); 
$startDate = new DateTime("2011-03-31",new DateTimeZone("Europe/London")); 

for($i=0; $i<6; $i++) 
{ 
    $startDaysArr[] = $startDate->format("Y-m-d"); 
    $startDate->modify("-1 day"); 
} 

$startDaysArr = array_reverse($startDaysArr, FALSE); 

Да, это происходит потому, что часы меняются, так что не полагаться на вычитая количество минут в x дней, но используйте объекты «DST safe» dateTime и перейдите в мир «современных» (скорее, в последнее десятилетие). PHP

+0

отличное решение Mark .. + 1;) – Gerep

Смежные вопросы