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.

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;

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


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


8

Im Pseudocode:

split it by colon
seconds = 3600 * HH + 60 * MM + SS

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;

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');

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;
}

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];

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.