.mktime и .strftime помогают вернуть неверный день недели

Прежде чем на меня накричат, я не php-кодировщик, и я много искал разные варианты, чтобы попытаться выяснить это, но безуспешно здесь и в сети. Я видел некоторые вещи, но у меня недостаточно понимания, чтобы применить их с моим ограниченным пониманием. Код php был разработан кем-то, кто исчез, поэтому не поддерживает, и у меня есть одна небольшая ошибка, которую мне нужно попытаться исправить, и почему парень, занимающийся html/css, даже пытается понять это без особой удачи. Так что оцените помощь группы и терпение, а также конкретику, если это возможно.

Проблема: код php возвращает неправильный день недели в отчете о статистике, создаваемом программным обеспечением. Поэтому, когда вы запускаете страницу статистики и запрашиваете БД, она возвращает значение, но появляется неправильная метка дня.

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

Вот то, что я предполагаю, это два раздела кода из моего исследования... вместо того, чтобы публиковать весь файл php. Я думаю, по крайней мере, я думаю, что сузил раздел кода... маленькие победы.

Код, используемый для получения первого дня месяца (который я видел там и сравнивал, выглядит правильно):

    function get_first_day($day_number=1, $month=false, $year=false)
{
  $month  = ($month === false) ? strftime("%m"): $month;
  $year   = ($year === false) ? strftime("%Y"): $year;

  $first_day = 1 + ((7+$day_number - strftime("%w", mktime(0,0,0,$month, 1, $year)))%7);

  return mktime(0,0,0,$month, $first_day, $year);
}

Прежде чем я продолжу, я также попытался установить для $day_number=1 различные значения от 0 до 6, но, похоже, это не дало никакого эффекта. Я прочитал несколько сообщений о том, что установка этого значения была проблемой, но для меня это не имело значения. Я подумал, что, возможно, «сеанс» вызывает проблему после попытки узнать о них, поэтому я попытался выйти из системы и снова войти в систему, очистив кеш, а также сменить браузер после изменения значения, но это ни к чему не привело.

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

<table id="graph_weekday" class="data" style="display:none" cellpadding="0" cellspacing="0" width="100%">
        <caption><?php echo _occupancy_per_week." / "._days;?></caption>
        <thead>
            <tr>
                <td class="no_input">&nbsp;</td>
                <?php
                foreach ($label_wk as $value) {
                    echo "<th>".strftime("%A", get_first_day($value, $_SESSION['statistic_month'], $_SESSION['selectedDate_year']))."</th>";
                }
                ?>
            </tr>
        </thead>
        <tbody>
            <tr>
                <th><?php echo _days;?></th>
                <?php
                foreach ($data_wk as $value) {
                    echo "<td>".$value."</td>";
                }
                ?>
            </tr>
        </tbody>
    </table>
                    }
                    ?>

Таким образом, кажется, что все работает, чтобы извлечь данные, но метка неверна. Хотя установка значения для $day_number= на что-то другое, похоже, не работает.

Что-то не так с.$value. который повторяется, и мне нужно применить get_first_day к значению?

обновление: пытаюсь разобраться в этом, но мне все еще нужна помощь. Я нашел это в коде, который, как я думаю, также переживает (возможно)

// Bar Plot Guest by weekday/month
$data_wk = array();
$label_wk = array();

    $statistic = querySQL('statistic_weekday');

    foreach ($statistic as $key => $value) {
        foreach($value as $paxsum){
            $label_wk[] = $key;
            $data_wk[] = $paxsum;
        }
    }

Спасибо за любую помощь.


person gman    schedule 04.02.2014    source источник
comment
Похоже, get_first_day должен возвращать первый день недели данного месяца? Тогда вы получите воскресенье из него, может быть, просто вопрос часового пояса — потому что понедельник в одних часовых поясах, конечно же, воскресенье в других. Так что проверьте настройки часового пояса вашего сервера/PHP.   -  person CBroe    schedule 04.02.2014
comment
Хотел бы я, чтобы это было что-то настолько простое. Настройка часового пояса верна для глобального сервера php.ini, но теперь повезло [ссылка] stackoverflow.com/questions/3682636/…, который использует аналогичный код, и я проверил свой код по сравнению с ним, поэтому предположил, что это что-то во второй части, но Точно сказать не могу. – @CBroe   -  person gman    schedule 04.02.2014
comment
Какие данные вы передаете функции в качестве первого параметра ($value в вашем цикле)?   -  person CBroe    schedule 04.02.2014
comment
@CBroe Я не уверен, так как никогда не работал с php. Фактическая страница статистики очень длинная. Прежде чем публиковать, я пытался много исследовать, чтобы включить код, который я считал актуальным, но, может быть, я пропустил что-то, что нужно включить, чтобы получить помощь? В своем исследовании я проследил все, что мог, и подумал, что эти три фрагмента и, конечно же, запрос SQl в другом файле — это все. Должен ли я опубликовать код запроса?   -  person gman    schedule 04.02.2014
comment
Запрос представляет собой более или менее просто SELECT SUM количества резервирований как paxsum из таблицы, где он соответствует некоторым критериям и основан на $_SESSION. Все остальное, связанное с датой в инструменте и в статистике, работает нормально. Это просто когда он перечисляет день недели под данными. Это похоже на то, что он начинается не в тот день, потому что шаблон правильный, просто помечен как неправильный. Это означает, что если у меня есть данные за три дня, они отображают интервал между днями правильно, но метка неверна. Я провел еще один тест на понедельник, четверг, пятницу, и данные вернулись в воскресенье/понедельник/четверг.   -  person gman    schedule 04.02.2014
comment
Хорошо, я думаю, что у меня есть это. Я менял значение $day_number=1 на другое число. Я не менял $first_day = 1. Когда я изменил $first_day = 5, похоже, это сработало. Это кажется правильным или вызовет у меня другие проблемы?   -  person gman    schedule 05.02.2014


Ответы (1)


Хорошо, я думаю, что у меня есть это. Я менял значение $day_number=1 на другое число. Я не менял $first_day = 1. Когда я изменил $first_day = 5, похоже, это сработало. Это кажется правильным или вызовет у меня другие проблемы?

  function get_first_day($day_number=1, $month=false, $year=false)
  {
    $month  = ($month === false) ? strftime("%m"): $month;
    $year   = ($year === false) ? strftime("%Y"): $year;

    $first_day = 5 + ((7+$day_number - strftime("%w", mktime(0,0,0,$month, 1, $year)))%7);

    return mktime(0,0,0,$month, $first_day, $year);
  }
person gman    schedule 05.02.2014