Дата/время PHP и mktime

Надеюсь, кто-нибудь может сказать мне, что происходит с этим небольшим сценарием отладки.

<?PHP
// function generates the list of times for
function generateTimes($date) { 

 $currentDate = $date; 
 echo "RECEIVED CURRENT DATE: " . date("m/d/Y g:iA", $currentDate) . "<br /><br />"; 

 for($i = 0; $i < 48; $i++) { 
  echo date("g:iA", $currentDate) . "<br />"; 
  $currentDate = mktime(date("g", $currentDate),date("i", $currentDate)+30,0,date("m", $currentDate),date("d", $currentDate),date("Y", $currentDate)); // 30 minutes
 } 

} 
if (isset($_POST['generate_date'])) { 
 echo "Date Stamp: " . strtotime($_POST['date']) . "<br /><br />";
 echo "The time you entered: " . date("r", strtotime($_POST['date'])) . "<br /><br />"; 
 generateTimes($_POST['date']); 

} 
echo "<form method=post action='timestampgen.php'>";
echo "<input type=text name='date' />"; 
echo "<input type=submit name='generate_date' value='Generate Time Stamp' />"; 
echo "</form><br /><br />"; 

?>

Я отправляю дату, например 01.10.10, 12:00, и хочу, чтобы она генерировала 30-минутные интервалы времени... но, похоже, она не работает, и я думаю, что это связано с моими параметрами mktime.

Я работал над чем-то весь день, так что, наверное, я схожу с ума.


person Dalton Conley    schedule 01.10.2010    source источник
comment
Вы забыли упомянуть, как ожидаемый результат отличается от фактического.   -  person Matthew    schedule 02.10.2010


Ответы (3)


Как насчет использования strtotime():

function generateTimes($date) {
    // convert to timestamp (make sure to validate the $date value)
    $currentDate = strtotime($date);

    for ($i=0; $i<48; $i++) {
        echo date("g:iA", $currentDate) . "<br />"; 
        $currentDate = strtotime('+30 minutes', $currentDate);
    }
}
person Alec    schedule 01.10.2010

Когда у вас есть текущее время, все, что вам нужно сделать, это добавить 1800 (30 минут умножить на 60 секунд) к значению метки даты, чтобы переместить его на полчаса вперед; нет необходимости снова и снова возиться с mktime().

person Stan Rogers    schedule 01.10.2010

start = new DateTime('10/1/10 12:00AM');
$interval = new DateInterval('PT30M');

foreach(new DatePeriod($start, $interval, 48) as $time)
{
        echo $time->format('Y-m-d g:iA')."\n";
}

Урожайность:

2010-10-01 12:00AM
2010-10-01 12:30AM
2010-10-01 1:00AM
2010-10-01 1:30AM
...
2010-10-01 11:30PM
2010-10-02 12:00AM

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

person Matthew    schedule 01.10.2010