Проверка даты и времени в PHP


Цель: создать обратный отсчет до нашей следующей доступен прямую трансляцию.

Подробности: мы прямую трансляцию шесть раз в неделю (ПСТ). 1. В воскресенье в 8:00 утра 2. В воскресенье в 10:00 утра 3. В воскресенье в 12:00 4. В воскресенье в 6:30 вечера 5. В среду в 7:00 вечера 6. В субботу в 10:00 утра

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

Я уверен, что я сделал могут быть очищены и улучшены, так скажите мне, как.

<?php
// Countdown Stuff
$year = date(Y);
$month = date(m);
$month_day = date(d);
$day = date(w);
$hour = date(G);
$min = date(i);
$addDay = 0;

// It's Sunday
if ( $day == 0 ) {
    if ( $hour < 8 ) {
       $hour = 8;
       $min = 0;
    } 
    else if ( $hour < 10 ) {
       $hour = 10;
       $min = 0;
    } 
    else if ( $hour < 12 ) {
       $hour = 12;
       $min = 0;
    }
    else if ( $hour <= 18 && $min < 30 ) {
       $hour = 18;
        $min = 30;
    } 
    else {
     $addDay = 3;
       $hour = 19;
       $min = 0;
    }
} 
// It's Monday
else if ( $day == 1 ) {
    $addDay = 2;
      $hour = 19;
      $min = 0;
} 
// It's Tuesday
else if ( $day == 2 ) {
    $addDay = 1;
      $hour = 19;
      $min = 0;
} 
// It's Wednesday
else if ( $day == 3) {

    if ( $hour < 19 ) {
       $hour = 19;
       $min = 0;
    } else {
     $addDay = 3;
       $hour = 10;
       $min = 0;
    }
} 
// It's Thursday
else if ( $day == 4 ) {
    $addDay = 2;
      $hour = 10;
      $min = 0;
} 
// It's Friday
else if ( $day == 5 ) {
    $addDay = 1;
      $hour = 10;
      $min = 0;
} 
// All that's left is Saturday
else {

    if ( $hour < 10 ) {
       $hour = 10;
       $min = 0;
    } else {
     $addDay = 1;
       $hour = 8;
       $min = 0;
    }
}


$build_date = $year . '-' . $month . '-' . $month_day . ' ' . $hour . ':' . $min . ':00';
$date = new DateTime($build_date);

if ( $addDay ) {
    $date->modify("+$addDay day");
}

$date = strtotime($date->format("Y-m-d G:i:s"));
$now = strtotime("now");
$count = $date - $now;
?>

<script type="text/javascript">
var myTime = <?=$count?>;
$('#countdown').countdown({ until: myTime}); 
</script>


5162
10
задан 28 января 2011 в 07:01 Источник Поделиться
Комментарии
4 ответа

Чтобы добавить в ответ Эндрю, воспользовавшись какой тип метки может быть создан с помощью функции strtotime(), ваш код может быть сокращен до 25 линий...

<?php

$schedule = array(
'this Sunday 8am',
'this Sunday 10am',
'this Sunday 12pm',
'this Sunday 6:30pm',
'this Wednesday 7pm',
'this Saturday 10am'
);

$current_time = strtotime('now');
foreach ($schedule as &$val) {
$val = strtotime($val);
// fix schedule to next week if time resolved to the past
if ($val - $current_time < 0) $val += 604800;
}
sort($schedule);
$countdown = $schedule[0] - $current_time;

?>

<script type="text/javascript">
var myTime = <?php echo $countdown; // just personally prefer full tags ?>;
$('#countdown').countdown({ until: myTime});
</script>

Добавить к визионер-программное обеспечение-решения-ответ, было бы лучше, чтобы сохранить расписание в базе данных или в отдельном XML/текст/JSON в/и т. д. тип файла. Таким образом, вы можете иметь персонал просто использовать внутреннюю форму для изменения графики, вместо того, что PHP разработчика жесткий-код меняется каждый раз. В этой веб-странице, вы можете дать сотрудникам, чтобы только выбрать день недели и время, и страницы перевести в строку, использования функции strtotime() в этом отсчет скрипт.

Редактировать: исправлена использования функции strtotime() значения. Поосторожнее с "этот день" против "далее". Для некоторых понимание того, что тип строк использования функции strtotime() можете взять, см.: http://www.gnu.org/software/tar/manual/html_node/Date-input-formats.html

11
ответ дан 29 января 2011 в 05:01 Источник Поделиться

Я не успел посмотреть все, но я заметил, Вы только установить $мин на нечто иное, чем 0 раз. Можно добавить следующее выше $build_date, а затем удалить все $мин = 0;S, и ты бы прояснить несколько строк:

if($min == date('i')) {
$min = 0;
}

Если это не изменение, которое случится только тогда, когда вы установите его в 30 в одном экземпляре, затем установите его в 0.

4
ответ дан 28 января 2011 в 09:01 Источник Поделиться

Несколько вещей, которые выскочили.

В вашей дате() вызовы передаются константы вместо строк, например, вы используете даты(г) в отличие от дата('г'), этом выдает ошибку заметили. PHP будет предположить, что вы имели в виду строку, но это лучше, чтобы быть явными.

Функции getdate() дает вам всю эту информацию вместо того, чтобы называть даты() 6 раз.

За то, что вы хотите сделать, я бы порекомендовал взглянуть на функцией mktime() функция. После расчета очередной текущий поток времени от текущего времени, просто пройти эти значения функцией mktime() и времени() - функцией mktime (), а вот сколько секунд у вас есть время до мероприятия. функцией mktime вырабатывает метку времени Unix, так что вы можете передать, что до дата() функция или в объект datetime в формат, изменить часовой пояс и т. д.

Если вы собираетесь иметь много если/операторов elseif подобное, было бы чище, чтобы использовать оператор switch.

3
ответ дан 28 января 2011 в 10:01 Источник Поделиться

Конечно, если ваша компания решает изменить потоки от воскресенье в 8:00 по вторник, в 2, вы будете иметь, чтобы пойти и взломать этот код. И если вы запутались с ';' или '?на PHP или младший разработчик передает "низзя" для использования функции strtotime()?

Разнообразьте свой подход. Вы должны хранить время поток извне; либо в файле или базе данных. Вы должны быть запросы тех времен, выполняя функции strtotime() разница между ними и сейчас, то минимальный положительный элемент и показывать, что.

2
ответ дан 29 января 2011 в 01:01 Источник Поделиться