Angenommen, ich habe einen Unix-Zeitstempel in PHP. Wie kann ich meinen PHP-Zeitstempel auf die nächste Minute runden? ZB 16:45:00 statt 16:45:34?
Danke für Ihre Hilfe! 🙂
Lyon
Angenommen, ich habe einen Unix-Zeitstempel in PHP. Wie kann ich meinen PHP-Zeitstempel auf die nächste Minute runden? ZB 16:45:00 statt 16:45:34?
Danke für Ihre Hilfe! 🙂
Yacoby
Wenn der Zeitstempel ein Zeitstempel im Unix-Stil ist, einfach
$rounded = round($time/60)*60;
Wenn es der von Ihnen angegebene Stil ist, können Sie ihn einfach in einen Zeitstempel im Unix-Stil und zurück konvertieren
$rounded = date('H:i:s', round(strtotime('16:45:34')/60)*60);
round()
wird verwendet, um auf einfache Weise sicherzustellen, dass auf rundet x
für Werte zwischen x - 0.5 <= x < x + 0.5
. Wenn Sie immer abrunden wollten (wie angegeben), könnten Sie verwenden floor()
oder die Modulo-Funktion
$rounded = floor($time/60)*60;
//or
$rounded = time() - time() % 60;
Yacoby, danke für die umfassende Erklärung! Nun, da Sie es erwähnt haben, ist round() die Funktion, die ich bevorzuge. Macht in meiner Bewerbung mehr Sinn. 🙂
– Lyon
2. März 2010 um 16:28 Uhr
Eine Alternative ist diese:
$t = time();
$t -= $t % 60;
echo $t;
Das habe ich bei jedem Anruf nachgelesen time()
in PHP musste den ganzen Weg durch den Stack zurück zum Betriebssystem gehen. Ich weiß nicht, ob dies in 5.3+ geändert wurde oder nicht? Der obige Code reduziert die Aufrufe auf time()…
Benchmark-Code:
$ php -r '$s = microtime(TRUE); for ($i = 0; $i < 10000000; $i++); $t = time(); $t -= $t %60; $e = microtime(TRUE); echo $e - $s . "\n\n";'
$ php -r '$s = microtime(TRUE); for ($i = 0; $i < 10000000; $i++); $t = time() - time() % 60; $e = microtime(TRUE); echo $e - $s . "\n\n";'
$ php -r '$s = microtime(TRUE); for ($i = 0; $i < 10000000; $i++); $t = floor(time() / 60) * 60; $e = microtime(TRUE); echo $e - $s . "\n\n";'
Interessanterweise machen über 10.000.000 Iterationen alle drei tatsächlich die gleiche Zeit;)
Ach verdammt. Schlage mich vor 🙂
Das war auch meine Lösung.
<?php
$round = ( round ( time() / 60 ) * 60 );
echo date('h:i:s A', $round );
?>
Verwenden Sie einfach Folgendes:
$last_hour = date('Y-m-d H:00:00') // to last hour;
$last_minute = date('Y-m-d H:i:00') // to last minute;
Ich benutze es, um alte Warenkörbe mit Ablaufdatum (+ 5 Minuten Nachfrist) in meiner Datenbank zu löschen:
// clean expired shopping carts
function shop_clean_carts($grace = 5) {
$expiry = date('Y-m-d H:i:00', strtotime("-$grace minutes"));
$q = "DELETE FROM `shop__cart`
WHERE `expiry` < '$expiry'
AND `expiry` IS NOT NULL
AND `fk_order_id` IS NULL";
$db->query($q);
return;
}
Dies ist besser für mySql NOW(), da die Abfrage zwischengespeichert wird.
16:45:00 hat immer noch Sekunden … Ich denke, Sie meinen, dass Sie auf die nächste nächste Minute runden möchten, anstatt Sekunden zu entfernen.
– Layke
2. März 2010 um 16:12 Uhr
Ich habe gerade PHP installiert, damit ich Ihnen den Code dafür geben kann. Ich möchte nicht raten, weil ich time() hasse. Ich antworte in 10 Minuten, falls sonst niemand hat.
– Layke
2. März 2010 um 16:16 Uhr
@Laykes codepad.org ist gut für schnelle Code-Checks
– Yacoby
2. März 2010 um 16:23 Uhr
Danke Laykes! Yacoby lieferte, was ich suchte. Ich werde meine Frage bearbeiten, um sie klarer zu machen.
– Lyon
2. März 2010 um 16:24 Uhr
@Yacoby: Das ist ziemlich cool. Ich habe sowieso gerade einen WAMP-Stack installiert. Ich habe es mit einem Lesezeichen versehen.
– Layke
2. März 2010 um 16:26 Uhr