Zeit im HH: MM: SS-Format nur in Sekunden umrechnen?

74

Wie kann man die Zeit im Format HH:MM:SSin eine flache Sekundenzahl umwandeln ?

PS Time kann manchmal nur im Format sein MM:SS.

Ryan
quelle

Antworten:

134

Keine Notwendigkeit für explodeirgendetwas:

$str_time = "23:12:95";

$str_time = preg_replace("/^([\d]{1,2})\:([\d]{2})$/", "00:$1:$2", $str_time);

sscanf($str_time, "%d:%d:%d", $hours, $minutes, $seconds);

$time_seconds = $hours * 3600 + $minutes * 60 + $seconds;

Und wenn Sie keine regulären Ausdrücke verwenden möchten:

$str_time = "2:50";

sscanf($str_time, "%d:%d:%d", $hours, $minutes, $seconds);

$time_seconds = isset($hours) ? $hours * 3600 + $minutes * 60 + $seconds : $minutes * 60 + $seconds;
Tim Cooper
quelle
Süße Lösung. Aber würde das nicht brechen, wenn HH nicht anwesend ist?
Simme
Habe es einfach repariert, damit es nicht funktioniert.
Tim Cooper
1
Bei der Verwendung von Zeitfunktionen musste ich mit Zeitzonen herumspielen, um es richtig zu machen, aber das ist viel einfacher.
Datum
Fehler in der letzten Zeile: $time_seconds = isset($seconds) ? $hours * 3600 + $minutes * 60 + $seconds : $hours * 60 + $minutes; Sollte sein$time_seconds = isset($hours) ? $hours * 3600 + $minutes * 60 + $seconds : $minutes * 60 + $seconds;
Andrew Lazarus
105

Ich denke, die einfachste Methode wäre, die strtotime()Funktion zu verwenden :

$time = '21:30:10';
$seconds = strtotime("1970-01-01 $time UTC");
echo $seconds;

// same with objects (for php5.3+)
$time = '21:30:10';
$dt = new DateTime("1970-01-01 $time", new DateTimeZone('UTC'));
$seconds = (int)$dt->getTimestamp();
echo $seconds;

demo


Die Funktion date_parse()kann auch zum Parsen von Datum und Uhrzeit verwendet werden:

$time = '21:30:10';
$parsed = date_parse($time);
$seconds = $parsed['hour'] * 3600 + $parsed['minute'] * 60 + $parsed['second'];

demo


Wenn Sie das Format MM:SSmit analysieren strtotime()oder date_parse()es fehlschlägt ( date_parse()wird in strtotime()und verwendet DateTime), denn wenn Sie ein Format wie den xx:yyParser eingeben, wird davon ausgegangen, dass dies der Fall ist HH:MMund nicht MM:SS. Ich würde vorschlagen, das Format zu überprüfen und voranzustellen, 00:wenn Sie nur haben MM:SS.

demo strtotime() demo date_parse()


Wenn Sie mehr als 24 Stunden haben, können Sie die nächste Funktion verwenden (sie funktioniert MM:SSund HH:MM:SSformatiert):

function TimeToSec($time) {
    $sec = 0;
    foreach (array_reverse(explode(':', $time)) as $k => $v) $sec += pow(60, $k) * $v;
    return $sec;
}

demo

Glavić
quelle
1
strtotime()erlaubt nicht, dass die Stunden über 24 hinausgehen - wenn Sie 25 oder höher verwenden, wird "false" zurückgegeben.
Sven
1
Ihre dritte Antwort für Zeiten über 24 Stunden ist genau das, was ich brauchte. Der array_reverseund explodieren :dann eine weitere Reise durch den verursacht foreachund eine andere pow(so dass beide hh: mm UND hh: mm: ss Arbeit ohne Änderung der Funktion) ist ein Geniestreich. Code par excellence. Ich kann mir kaum ein effizienteres Beispiel vorstellen. Vielen Dank!
FirstFraktal
@ Glavić Einige hilft mir auch
Abdulla Nilam
1
Ich habe mir nur die erste Antwort angesehen und dachte, was wäre, wenn ich die Unix-Epoche nutzen würde ... stimme von mir ab!
Beenden Sie
1
Die dritte Option funktioniert für jedes gültige Format, das ich darauf werfen könnte. 👍
Synetech
11
    $time = 00:06:00;
    $timeInSeconds = strtotime($time) - strtotime('TODAY');
Sparsh Turkane
quelle
8

Im Pseudocode:

split it by colon
seconds = 3600 * HH + 60 * MM + SS
CanSpice
quelle
6
Wie er schrieb, ist es Pseudocode. "Pretend Code", um zu erklären, wie etwas getan werden könnte.
Simme
Es spielt keine Rolle, ob es sich um einen Pseudocode handelt oder nicht, da für die Frage die Unterstützung des MM: SS-Formats erforderlich ist, was bei dieser Antwort nicht der Fall ist.
Synetech
5

Versuche dies:

$time = "21:30:10";
$timeArr = array_reverse(explode(":", $time));
$seconds = 0;
foreach ($timeArr as $key => $value)
{
    if ($key > 2) break;
    $seconds += pow(60, $key) * $value;
}
echo $seconds;
Chandu
quelle
Ich liebe es! $ time = "01: 23: 54: 21: 30: 10" gibt mir eine Antwort von 1087421410 Sekunden.
Roger Halliburton
2
Probieren Sie es jetzt. Natürlich können Sie so etwas wie "898989: 8989898: 899899" übergeben, aber ich gehe davon aus, dass grundlegende Überprüfungen zu der Zeit durchgeführt werden, die eingegeben wurde, bevor der Code die Sekundenberechnung erreicht hat.
Chandu
5

Mit dieser strtotimeFunktion können Sie die Anzahl der Sekunden von zurückgeben today 00:00:00.

$seconds= strtotime($time) - strtotime('00:00:00');
mehdi jalilvand
quelle
1
Während dieses Code-Snippet die Frage lösen kann, hilft eine Erklärung wirklich dabei, die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage in Zukunft für Leser beantworten und diese Personen möglicherweise die Gründe für Ihren Codevorschlag nicht kennen. Bitte versuchen Sie auch, Ihren Code nicht mit erklärenden Kommentaren zu überfüllen. Dies verringert die Lesbarkeit sowohl des Codes als auch der Erklärungen!
Filnor
2

Einfach

function timeToSeconds($time)
{
     $timeExploded = explode(':', $time);
     if (isset($timeExploded[2])) {
         return $timeExploded[0] * 3600 + $timeExploded[1] * 60 + $timeExploded[2];
     }
     return $timeExploded[0] * 3600 + $timeExploded[1] * 60;
}
midan888
quelle
0
<?php
$time    = '21:32:32';
$seconds = 0;
$parts   = explode(':', $time);

if (count($parts) > 2) {
    $seconds += $parts[0] * 3600;
}
$seconds += $parts[1] * 60;
$seconds += $parts[2];
simme
quelle
Was wäre, wenn es nur 32:32 ohne die Stunde wäre?
Ryan
1
Dann würde es nicht funktionieren. Sie müssen natürlich zuerst das Format validieren. Und entfernen Sie die ersten $ Sekunden + = Teil
simme
Wie würde das Umdrehen des Arrays helfen?
Simme
Nein. Wenn HH nicht vorhanden ist und das Array umgedreht wird, werden die Sekunden als Stunden behandelt.
Simme
0
function time2sec($time) {
    $durations = array_reverse(explode(':', $item->duration));
    $second = array_shift($durations);
    foreach ($durations as $duration) {
        $second += (60 * $duration);
    }
    return $second;
}
echo time2sec('4:52'); // 292
echo time2sec('2:01:42'); // 7302
Kodmanyagha
quelle