PHP дата / неделя проблема - PullRequest
1 голос
/ 05 января 2010

Я немного растерялся.Кажется, что в конце 2009 года мой код пропал без вести целую неделю, и я попробовал несколько разных вещей.

Моя базовая функция для получения даты начала и окончания недели ниже.Учитывая год, неделю и день недели, он дает вам дату.

function datefromweeknr($aYear, $aWeek, $aDay)
    {
        $Days=array('xx','ma','di','wo','do','vr','za','zo');
        //xx = Current Sun, ma = Mon ..... zo = Sun of the next Week
        $DayOfWeek=array_search($aDay,$Days); //get day of week (1=Monday)
        $DayOfWeekRef = date("w", mktime (0,0,0,1,4,$aYear)); //get day of week of January 4 (always week 1)
        if ($DayOfWeekRef==0){
            $DayOfWeekRef=7;
        }
        $ResultDate=mktime(0,0,0,1,4,$aYear)+((($aWeek-1)*7+($DayOfWeek-$DayOfWeekRef))*86400);
        return $ResultDate;
    }

Казалось, что все работает отлично, пока я не понял, что пропускал неделю с 27 декабря 2009 года по 2 января 2010 года.*

echo '<table border="1">';
for($i = 1; $i < 53; $i++){
    if($i < 10){
        $w = '0'.$i.'1';
    }
    else{
        $w = $i.'1';
    }
    echo '<tr><td>Week#'.$i.' </td><td> '.date("Y-m-d",datefromweeknr(2009,$i,"xx")).' </td><td> '.date("Y-m-d",datefromweeknr(2009, $i,"za")).'</td><td> Week = '.date("W: Y-m-d",strtotime("2009W$w")).'  </td></tr>';

}

echo '</table>';

Кажется, 52-я неделя года заканчивается 2009-12-26, а 1-я неделя нового года начинается 2010-01-03.Я теряю целую неделю, нет, Буэно!

Кто-нибудь знает, что я делаю неправильно, или может указать мне на глупый способ указать номер недели и год, чтобы получить дату начала и окончанияэтой недели, не теряя при этом ни одного дня?

Ответы [ 2 ]

0 голосов
/ 05 января 2010

Ваш вопрос остался у меня из-за комментария об ошибке, который я прочитал сегодня на php.net:

В PHP 5 до 5.2.7, запрашивая данное вхождение данного дня недели в месяц, когда этот будний день был первый день месяца будет неправильно добавить одну неделю к возвращенная метка времени. Это было исправлено в 5.2.7 и более поздних версиях.

Что сейчас неуместно, но я бы предложил вам заменить ваши вычисления в datefromweeknr на вызовы strtotime Я почти уверен, что strtotime исправит ошибку в вычислениях.

Так что вы можете использовать что-то вроде:

strtotime('last Monday', $timestamp);
0 голосов
/ 05 января 2010

Проверьте здесь: http://www.onlineconversion.com/day_week_number.htm Если вы введете 29 декабря 2009 г., убедитесь, что США и ИСО / Европа дают разные номера недель (соответственно, 52 и 53). Может ли это быть связано с вашей проблемой? Какому стандарту вы соответствуете даты?

Edit: От http://www.epochconverter.com/epoch/weeknumbers.php: Номер недели в соответствии со стандартом ISO-8601, недели, начинающиеся с понедельника. Первая неделя года - это неделя, в которой содержится первый четверг этого года. Самый высокий номер недели в году - 52 или 53.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...