Время PHP (часы и минуты) не добавляется правильно - PullRequest
0 голосов
/ 06 мая 2018

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

У меня есть таблица в базе данных, и мне нужно подвести итоги времени из столбца в часах, минутах и ​​секундах. Мне нужно, чтобы вычисления происходили в PHP для дальнейшего использования после этой транзакции.

Мое время в базе данных отформатировано так:

01:30:00
01:00:00
00:00:00
00:00:00

Мой код такой:

date_default_timezone_set(UTC);
while($sql_row = mysqli_fetch_array($sql_query)){
$time = $sql_row['time'];
$total_time = strtotime("1970-01-01 ".$time)+strtotime("1970-01-01 ".$total_time);

echo date('H:i:s',$total_time)."<BR>";
    }

echo date('H:i',$total_time);

Проблема в том, что выход показывает, что он вообще не добавляется для первых двух строк. Затем для всех строк, которые вводятся с 00:00:00, я получаю 12:00:00, как это. 1:00:00 1:30:00 12:00:00 12: 00: 00

Я поиграл с этим тысячей способов и думаю, что это как-то связано с меткой времени unix, которая составляет +11/12 часов от моего местного времени. (ВРЕМЯ ПО ГРИНВИЧУ). Я попытался использовать date_default_timezone_set (UTC), но затем я получил тот же результат. Я ожидаю, что это зацикленное значение повторится в 02:30:00, поскольку последние значения не должны ничего добавлять к значению.

Чтобы проверить это без цикла, я попробовал это:

date_default_timezone_set(UTC);
$date = date('Y-m-d');
$time1 = "01:00:00";
$time2 = "01:30:00";
$time3 = "00:00:00";

$total = strtotime($date." ".$time1)+strtotime($date." ".$time2)+strtotime($date." ".$time3);

echo date('H:i:s',$total);

И это прекрасно работает! Некоторым образом я думаю, что цикл while влияет и на него, но я нигде не вижу ссылки на добавление времени в циклы while в PHP.

Заранее спасибо за любую помощь

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Спасибо, Ян, это сработало. Я думаю, что я пришел к этому с неправильной точки зрения.

Мне пришлось немного изменить код, чтобы использовать цикл while, потому что цикл foreach генерировал только первые два значения массива.

Спасибо за вашу помощь, очень признателен.

$total_seconds = 0;
while($testrow = mysqli_fetch_array($timings, MYSQLI_ASSOC)){
    list($hours, $minutes, $seconds) = explode(':', $testrow['time_dual']);
    $total_seconds += $seconds + ($minutes * 60) + ($hours * 60 * 60);
    echo $testrow['time_dual']."<br>";// For testing only
}

$format     = sprintf('%02d:%02d:%02d', ($total_seconds / 3600), ($total_seconds / 60 % 60), $total_seconds % 60); 
$as_date    = date("Y-m-d H:i:s", $total_seconds);

echo "total seconds: ".$total_seconds ." | as date: ".$as_date." | formatted: ".$format;
0 голосов
/ 06 мая 2018

Интересный подход с использованием date и stringtotime.

Я бы стрелял в секунды. Что-то вроде ...

$timings = array("01:30:00", "01:00:00", "60:00:00", "26:00:11");
$total_seconds = 0;
foreach ($timings as $time) 
{
    list($hours, $minutes, $seconds) = explode(':', $time);
    $total_seconds += $seconds + ($minutes * 60) + ($hours * 60 * 60);
}

$format     = sprintf('%02d:%02d:%02d', ($total_seconds / 3600), ($total_seconds / 60 % 60), $total_seconds % 60); 
$as_date    = date("Y-m-d H:i:s", $total_seconds);

echo "total seconds: ".$total_seconds ." | as date: ".$as_date." | formatted: ".$format;
...