Konvertieren Sie Sekunden in Tage, Stunden, Minuten und Sekunden

92

Ich möchte eine Variable, $uptimedie Sekunden ist, in Tage, Stunden, Minuten und Sekunden konvertieren .

Beispiel:

$uptime = 1640467;

Ergebnis sollte sein:

18 days 23 hours 41 minutes
Florian
quelle

Antworten:

214

Dies kann mit DateTimeKlasse erreicht werden

Verwenden:

echo secondsToTime(1640467);
# 18 days, 23 hours, 41 minutes and 7 seconds

Funktion:

function secondsToTime($seconds) {
    $dtF = new \DateTime('@0');
    $dtT = new \DateTime("@$seconds");
    return $dtF->diff($dtT)->format('%a days, %h hours, %i minutes and %s seconds');
}

demo

Glavić
quelle
@ Glavić Wie würde ich dies für Woche und Monat unterstützen?
Socca1157
2
Stellen Sie sicher, dass Sie der Funktion eine Validierung hinzufügen. if (leer ($ Sekunden)) {return false;}
ein Codierer
4
@acoder: Ich denke, diese Funktion sollte sich nicht um die Validierung kümmern. Die Validierung sollte vor dem Funktionsaufruf eingerichtet werden. Trotzdem ist Ihre Validierung immer noch falsch, da sie beispielsweise auch das Alphabet besteht.
Glavić
2
Was bedeutet das @, wenn es als Argument an den DateTimeKonstruktor übergeben wird?
Ivanka Todorova
4
@IvankaTodorova: Wert nach @ist Unix-Zeitstempel.
Glavić
44

Dies ist die Funktion, die um Tage umgeschrieben wurde. Ich habe auch die Variablennamen geändert, um den Code verständlicher zu machen ...

/** 
 * Convert number of seconds into hours, minutes and seconds 
 * and return an array containing those values 
 * 
 * @param integer $inputSeconds Number of seconds to parse 
 * @return array 
 */ 

function secondsToTime($inputSeconds) {

    $secondsInAMinute = 60;
    $secondsInAnHour  = 60 * $secondsInAMinute;
    $secondsInADay    = 24 * $secondsInAnHour;

    // extract days
    $days = floor($inputSeconds / $secondsInADay);

    // extract hours
    $hourSeconds = $inputSeconds % $secondsInADay;
    $hours = floor($hourSeconds / $secondsInAnHour);

    // extract minutes
    $minuteSeconds = $hourSeconds % $secondsInAnHour;
    $minutes = floor($minuteSeconds / $secondsInAMinute);

    // extract the remaining seconds
    $remainingSeconds = $minuteSeconds % $secondsInAMinute;
    $seconds = ceil($remainingSeconds);

    // return the final array
    $obj = array(
        'd' => (int) $days,
        'h' => (int) $hours,
        'm' => (int) $minutes,
        's' => (int) $seconds,
    );
    return $obj;
}

Quelle: CodeAid () - http://codeaid.net/php/convert-seconds-to-hours-minutes-and-seconds-(php)

Julian Moreno
quelle
Es wäre schön, Quelle aufzunehmen
Martin.
Wären Sie so freundlich, dieser Funktion Tage hinzuzufügen?
Knittledan
@knittledan, erscheint nicht so :)
AO_
1
@ hsmoore.com Ich ging voran und fand dies heraus $ Tage = Etage ($ Sekunden / (60 * 60 * 24)); // Stunden extrahieren $ divisor_for_hours = $ Sekunden% (60 * 60 * 24); $ Stunden = Etage ($ divisor_for_hours / (60 * 60));
Knittledan
1
Dies funktioniert tagelang nicht wie erwartet. Sie müssen ($ Tage * 24) von $ Stunden subtrahieren, sonst werden die Stunden in den Tagen in $ Tagen und $ Stunden doppelt gezählt. zB Eingabe 100000 => 1 Tag und 27 Stunden. Dies sollte 1 Tag und 3 Stunden sein.
Finiteloop
30

Basierend auf der Antwort von Julian Moreno, aber geändert, um die Antwort als Zeichenfolge (nicht als Array) anzugeben, schließen Sie nur die erforderlichen Zeitintervalle ein und nehmen Sie nicht den Plural an.

Der Unterschied zwischen dieser und der am höchsten bewerteten Antwort ist:

Für 259264Sekunden würde dieser Code geben

3 Tage, 1 Minute, 4 Sekunden

Für 259264Sekunden würde die Antwort mit der höchsten Stimme (von Glavić) geben

3 Tage, 0 Stunden , 1 Minute und 4 Sekunden

function secondsToTime($inputSeconds) {
    $secondsInAMinute = 60;
    $secondsInAnHour = 60 * $secondsInAMinute;
    $secondsInADay = 24 * $secondsInAnHour;

    // Extract days
    $days = floor($inputSeconds / $secondsInADay);

    // Extract hours
    $hourSeconds = $inputSeconds % $secondsInADay;
    $hours = floor($hourSeconds / $secondsInAnHour);

    // Extract minutes
    $minuteSeconds = $hourSeconds % $secondsInAnHour;
    $minutes = floor($minuteSeconds / $secondsInAMinute);

    // Extract the remaining seconds
    $remainingSeconds = $minuteSeconds % $secondsInAMinute;
    $seconds = ceil($remainingSeconds);

    // Format and return
    $timeParts = [];
    $sections = [
        'day' => (int)$days,
        'hour' => (int)$hours,
        'minute' => (int)$minutes,
        'second' => (int)$seconds,
    ];

    foreach ($sections as $name => $value){
        if ($value > 0){
            $timeParts[] = $value. ' '.$name.($value == 1 ? '' : 's');
        }
    }

    return implode(', ', $timeParts);
}

Ich hoffe das hilft jemandem.

Luke Cousins
quelle
1
Ich bevorzuge dieses, weil es das "s" von "1 Stunde" entfernt, und in meinem Fall wollte ich Tage entfernen und nur eine große Stundenzahl haben, und diese Methode war sehr einfach an diese <3 anzupassen.
Ryan S
1
Sehr netter Luke, hält es kompakt und sauber!
VoidZA
19

Hier ist es eine einfache 8-Zeilen-PHP-Funktion, die eine Anzahl von Sekunden in eine von Menschen lesbare Zeichenfolge konvertiert, einschließlich der Anzahl von Monaten für große Sekunden:

PHP-Funktion Sekunden2human ()

function seconds2human($ss) {
$s = $ss%60;
$m = floor(($ss%3600)/60);
$h = floor(($ss%86400)/3600);
$d = floor(($ss%2592000)/86400);
$M = floor($ss/2592000);

return "$M months, $d days, $h hours, $m minutes, $s seconds";
}
Snippetsofcode
quelle
2
Einfach und doch effizient. Obwohl mir das "Monate" -Bit nicht gefallen hat.
Francisco Presencia
1
Sie sollten Code in Ihre Antwort aufnehmen und nicht auf eine andere Seite verlinken. Es gibt keine Möglichkeit festzustellen, dass die Website, auf die Sie verlinken, morgen noch vorhanden sein wird
Zachary Weixelbaum
10
gmdate("d H:i:s",1640467);

Ergebnis wird 19 23:41:07 sein. Wenn es nur eine Sekunde länger als der normale Tag ist, erhöht es den Tageswert für 1 Tag. Aus diesem Grund wird 19 angezeigt. Sie können das Ergebnis für Ihre Anforderungen auflösen und beheben.

Caner SAYGIN
quelle
Sie können diesen Code auch folgendermaßen verbessern: Auf $uptime = gmdate("y m d H:i:s", 1640467); $uptimeDetail = explode(" ",$uptime); echo (string)($uptimeDetail[0]-70).' year(s) '.(string)($uptimeDetail[1]-1).' month(s) '.(string)($uptimeDetail[2]-1).' day(s) '.(string)$uptimeDetail[3];diese Weise erhalten Sie auch Informationen zu Jahr und Monat.
Caner SAYGIN
Um den Fehler von +1 Tagen zu vermeiden, subtrahieren Sie einfach (24 * 60 * 60) vom Quellzeitstempel in Sekunden.
andreszs
9

Hier gibt es einige sehr gute Antworten, aber keine davon hat meine Bedürfnisse abgedeckt. Ich habe auf Glavics Antwort aufgebaut , um einige zusätzliche Funktionen hinzuzufügen, die ich brauchte.

  • Drucken Sie keine Nullen. Also "5 Minuten" statt "0 Stunden, 5 Minuten"
  • Behandeln Sie den Plural richtig, anstatt standardmäßig die Pluralform zu verwenden.
  • Begrenzen Sie die Ausgabe auf eine festgelegte Anzahl von Einheiten. Also "2 Monate, 2 Tage" statt "2 Monate, 2 Tage, 1 Stunde, 45 Minuten"

Sie können eine laufende Version des Codes sehen here.

function secondsToHumanReadable(int $seconds, int $requiredParts = null)
{
    $from     = new \DateTime('@0');
    $to       = new \DateTime("@$seconds");
    $interval = $from->diff($to);
    $str      = '';

    $parts = [
        'y' => 'year',
        'm' => 'month',
        'd' => 'day',
        'h' => 'hour',
        'i' => 'minute',
        's' => 'second',
    ];

    $includedParts = 0;

    foreach ($parts as $key => $text) {
        if ($requiredParts && $includedParts >= $requiredParts) {
            break;
        }

        $currentPart = $interval->{$key};

        if (empty($currentPart)) {
            continue;
        }

        if (!empty($str)) {
            $str .= ', ';
        }

        $str .= sprintf('%d %s', $currentPart, $text);

        if ($currentPart > 1) {
            // handle plural
            $str .= 's';
        }

        $includedParts++;
    }

    return $str;
}
Ramy Nasr
quelle
1
es hat mir sehr geholfen
Manojkiran.A
Ich werde die Funktion basierend auf Ihrer in Laravel Weise
erstellen
8

Kurz, einfach, zuverlässig:

function secondsToDHMS($seconds) {
    $s = (int)$seconds;
    return sprintf('%d:%02d:%02d:%02d', $s/86400, $s/3600%24, $s/60%60, $s%60);
}
Jérémie Germain
quelle
3
Weitere Erklärungen in dieser Antwort würden viel bewirken, z. B. was die Ganzzahlkonstanten darstellen und wie die Formatierung von Zeichenfolgen mit sprintf funktioniert.
1
Ich würde Sprintf machen ('% dd:% 02dh:% 02dm:% 02ds', $ s / 86400, $ s / 3600% 24, $ s / 60% 60, $ s% 60); nur um noch humnaner zu sein (ex: 0d: 00h: 05m: 00s). Aber wahrscheinlich die beste Lösung hier.
Ricardo Martins
6

Der einfachste Ansatz wäre, eine Methode zu erstellen, die ein DateInterval aus dem DateTime :: diff der relativen Zeit in $ Sekunden von der aktuellen Zeit $ now zurückgibt, die Sie dann verketten und formatieren können. Beispielsweise:-

public function toDateInterval($seconds) {
    return date_create('@' . (($now = time()) + $seconds))->diff(date_create('@' . $now));
}

Verketten Sie nun Ihren Methodenaufruf mit dem Format DateInterval ::

echo $this->toDateInterval(1640467)->format('%a days %h hours %i minutes'));

Ergebnis:

18 days 23 hours 41 minutes
Trent Renshaw
quelle
3

Obwohl es eine ziemlich alte Frage ist, kann man diese nützlich finden (nicht geschrieben, um schnell zu sein):

function d_h_m_s__string1($seconds)
{
    $ret = '';
    $divs = array(86400, 3600, 60, 1);

    for ($d = 0; $d < 4; $d++)
    {
        $q = (int)($seconds / $divs[$d]);
        $r = $seconds % $divs[$d];
        $ret .= sprintf("%d%s", $q, substr('dhms', $d, 1));
        $seconds = $r;
    }

    return $ret;
}

function d_h_m_s__string2($seconds)
{
    if ($seconds == 0) return '0s';

    $can_print = false; // to skip 0d, 0d0m ....
    $ret = '';
    $divs = array(86400, 3600, 60, 1);

    for ($d = 0; $d < 4; $d++)
    {
        $q = (int)($seconds / $divs[$d]);
        $r = $seconds % $divs[$d];
        if ($q != 0) $can_print = true;
        if ($can_print) $ret .= sprintf("%d%s", $q, substr('dhms', $d, 1));
        $seconds = $r;
    }

    return $ret;
}

function d_h_m_s__array($seconds)
{
    $ret = array();

    $divs = array(86400, 3600, 60, 1);

    for ($d = 0; $d < 4; $d++)
    {
        $q = $seconds / $divs[$d];
        $r = $seconds % $divs[$d];
        $ret[substr('dhms', $d, 1)] = $q;

        $seconds = $r;
    }

    return $ret;
}

echo d_h_m_s__string1(0*86400+21*3600+57*60+13) . "\n";
echo d_h_m_s__string2(0*86400+21*3600+57*60+13) . "\n";

$ret = d_h_m_s__array(9*86400+21*3600+57*60+13);
printf("%dd%dh%dm%ds\n", $ret['d'], $ret['h'], $ret['m'], $ret['s']);

Ergebnis:

0d21h57m13s
21h57m13s
9d21h57m13s
Artur
quelle
3
function seconds_to_time($seconds){
     // extract hours
    $hours = floor($seconds / (60 * 60));

    // extract minutes
    $divisor_for_minutes = $seconds % (60 * 60);
    $minutes = floor($divisor_for_minutes / 60);

    // extract the remaining seconds
    $divisor_for_seconds = $divisor_for_minutes % 60;
    $seconds = ceil($divisor_for_seconds);

    //create string HH:MM:SS
    $ret = $hours.":".$minutes.":".$seconds;
    return($ret);
}
James Doherty
quelle
1
Sie vermissen Tage
Sam Tuke
3
function convert($seconds){
$string = "";

$days = intval(intval($seconds) / (3600*24));
$hours = (intval($seconds) / 3600) % 24;
$minutes = (intval($seconds) / 60) % 60;
$seconds = (intval($seconds)) % 60;

if($days> 0){
    $string .= "$days days ";
}
if($hours > 0){
    $string .= "$hours hours ";
}
if($minutes > 0){
    $string .= "$minutes minutes ";
}
if ($seconds > 0){
    $string .= "$seconds seconds";
}

return $string;
}

echo convert(3744000);
Madushanka Sampath
quelle
2

Lösung, die 0 Werte ausschließen und korrekte Singular- / Pluralwerte festlegen sollte

use DateInterval;
use DateTime;

class TimeIntervalFormatter
{

    public static function fromSeconds($seconds)
    {
        $seconds = (int)$seconds;
        $dateTime = new DateTime();
        $dateTime->sub(new DateInterval("PT{$seconds}S"));
        $interval = (new DateTime())->diff($dateTime);
        $pieces = explode(' ', $interval->format('%y %m %d %h %i %s'));
        $intervals = ['year', 'month', 'day', 'hour', 'minute', 'second'];
        $result = [];
        foreach ($pieces as $i => $value) {
            if (!$value) {
                continue;
            }
            $periodName = $intervals[$i];
            if ($value > 1) {
                $periodName .= 's';
            }
            $result[] = "{$value} {$periodName}";
        }
        return implode(', ', $result);
    }
}
radzserg
quelle
1

Eine erweiterte Version von Glavićs hervorragender Lösung mit ganzzahliger Validierung, Lösung des 1-s-Problems und zusätzlicher Unterstützung für Jahre und Monate auf Kosten einer geringeren Computeranalyse, um mehr Menschenfreundlichkeit zu gewährleisten:

<?php
function secondsToHumanReadable(/*int*/ $seconds)/*: string*/ {
    //if you dont need php5 support, just remove the is_int check and make the input argument type int.
    if(!\is_int($seconds)){
        throw new \InvalidArgumentException('Argument 1 passed to secondsToHumanReadable() must be of the type int, '.\gettype($seconds).' given');
    }
    $dtF = new \DateTime ( '@0' );
    $dtT = new \DateTime ( "@$seconds" );
    $ret = '';
    if ($seconds === 0) {
        // special case
        return '0 seconds';
    }
    $diff = $dtF->diff ( $dtT );
    foreach ( array (
            'y' => 'year',
            'm' => 'month',
            'd' => 'day',
            'h' => 'hour',
            'i' => 'minute',
            's' => 'second' 
    ) as $time => $timename ) {
        if ($diff->$time !== 0) {
            $ret .= $diff->$time . ' ' . $timename;
            if ($diff->$time !== 1 && $diff->$time !== -1 ) {
                $ret .= 's';
            }
            $ret .= ' ';
        }
    }
    return substr ( $ret, 0, - 1 );
}

var_dump(secondsToHumanReadable(1*60*60*2+1)); -> string(16) "2 hours 1 second"

hanshenrik
quelle
1

Die von mir geschriebene Intervallklasse kann verwendet werden. Es kann auch in umgekehrter Weise verwendet werden.

composer require lubos/cakephp-interval

$Interval = new \Interval\Interval\Interval();

// output 2w 6h
echo $Interval->toHuman((2 * 5 * 8 + 6) * 3600);

// output 36000
echo $Interval->toSeconds('1d 2h');

Weitere Informationen finden Sie hier https://github.com/LubosRemplik/CakePHP-Interval

Luboš Remplík
quelle
1

Mit DateInterval :

$d1 = new DateTime();
$d2 = new DateTime();
$d2->add(new DateInterval('PT'.$timespan.'S'));

$interval = $d2->diff($d1);
echo $interval->format('%a days, %h hours, %i minutes and %s seconds');

// Or
echo sprintf('%d days, %d hours, %d minutes and %d seconds',
    $interval->days,
    $interval->h,
    $interval->i,
    $interval->s
);

// $interval->y => years
// $interval->m => months
// $interval->d => days
// $interval->h => hours
// $interval->i => minutes
// $interval->s => seconds
// $interval->days => total number of days
Zayon
quelle
0

Hier ist ein Code, den ich gerne verwende, um die Dauer zwischen zwei Daten zu ermitteln. Es akzeptiert zwei Daten und gibt Ihnen eine schöne satzstrukturierte Antwort.

Dies ist eine leicht modifizierte Version des hier gefundenen Codes .

<?php

function dateDiff($time1, $time2, $precision = 6, $offset = false) {

    // If not numeric then convert texts to unix timestamps

    if (!is_int($time1)) {
            $time1 = strtotime($time1);
    }

    if (!is_int($time2)) {
            if (!$offset) {
                    $time2 = strtotime($time2);
            }
            else {
                    $time2 = strtotime($time2) - $offset;
            }
    }

    // If time1 is bigger than time2
    // Then swap time1 and time2

    if ($time1 > $time2) {
            $ttime = $time1;
            $time1 = $time2;
            $time2 = $ttime;
    }

    // Set up intervals and diffs arrays

    $intervals = array(
            'year',
            'month',
            'day',
            'hour',
            'minute',
            'second'
    );
    $diffs = array();

    // Loop thru all intervals

    foreach($intervals as $interval) {

            // Create temp time from time1 and interval

            $ttime = strtotime('+1 ' . $interval, $time1);

            // Set initial values

            $add = 1;
            $looped = 0;

            // Loop until temp time is smaller than time2

            while ($time2 >= $ttime) {

                    // Create new temp time from time1 and interval

                    $add++;
                    $ttime = strtotime("+" . $add . " " . $interval, $time1);
                    $looped++;
            }

            $time1 = strtotime("+" . $looped . " " . $interval, $time1);
            $diffs[$interval] = $looped;
    }

    $count = 0;
    $times = array();

    // Loop thru all diffs

    foreach($diffs as $interval => $value) {

            // Break if we have needed precission

            if ($count >= $precision) {
                    break;
            }

            // Add value and interval
            // if value is bigger than 0

            if ($value > 0) {

                    // Add s if value is not 1

                    if ($value != 1) {
                            $interval.= "s";
                    }

                    // Add value and interval to times array

                    $times[] = $value . " " . $interval;
                    $count++;
            }
    }

    if (!empty($times)) {

            // Return string with times

            return implode(", ", $times);
    }
    else {

            // Return 0 Seconds

    }

    return '0 Seconds';
}

Quelle: https://gist.github.com/ozh/8169202

Mike Johanning
quelle
0

Alles in einer Lösung. Gibt keine Einheiten mit Nullen an. Erzeugt nur die von Ihnen angegebene Anzahl von Einheiten (standardmäßig 3). Ziemlich lang, vielleicht nicht sehr elegant. Definitionen sind optional, können sich jedoch in einem großen Projekt als nützlich erweisen.

define('OneMonth', 2592000);
define('OneWeek', 604800);  
define('OneDay', 86400);
define('OneHour', 3600);    
define('OneMinute', 60);

function SecondsToTime($seconds, $num_units=3) {        
    $time_descr = array(
                "months" => floor($seconds / OneMonth),
                "weeks" => floor(($seconds%OneMonth) / OneWeek),
                "days" => floor(($seconds%OneWeek) / OneDay),
                "hours" => floor(($seconds%OneDay) / OneHour),
                "mins" => floor(($seconds%OneHour) / OneMinute),
                "secs" => floor($seconds%OneMinute),
                );  

    $res = "";
    $counter = 0;

    foreach ($time_descr as $k => $v) {
        if ($v) {
            $res.=$v." ".$k;
            $counter++;
            if($counter>=$num_units)
                break;
            elseif($counter)
                $res.=", ";             
        }
    }   
    return $res;
}

Sie können gerne abstimmen, aber versuchen Sie es unbedingt in Ihrem Code. Es könnte genau das sein, was Sie brauchen.

AnDenix
quelle
0

Die Lösung für dieses Problem habe ich (damals, als ich PHP lernte) ohne In-Funktionen verwendet:

$days = (int)($uptime/86400); //1day = 86400seconds
$rdays = (uptime-($days*86400)); 
//seconds remaining after uptime was converted into days
$hours = (int)($rdays/3600);//1hour = 3600seconds,converting remaining seconds into hours
$rhours = ($rdays-($hours*3600));
//seconds remaining after $rdays was converted into hours
$minutes = (int)($rhours/60); // 1minute = 60seconds, converting remaining seconds into minutes
echo "$days:$hours:$minutes";

Obwohl dies eine alte Frage war, können neue Lernende, die darauf stoßen, diese Antwort nützlich finden.

VulnerableBoy
quelle
0
a=int(input("Enter your number by seconds "))
d=a//(24*3600)   #Days
h=a//(60*60)%24  #hours
m=a//60%60       #minutes
s=a%60           #seconds
print("Days ",d,"hours ",h,"minutes ",m,"seconds ",s)
Malk Ghassan
quelle
0

Ich weiß nicht, warum einige dieser Antworten lächerlich lang oder komplex sind. Hier ist eine, die die DateTime-Klasse verwendet . Ein bisschen ähnlich wie Radzsergs Antwort. Dies zeigt nur die erforderlichen Einheiten an und negative Zeiten haben das Suffix 'vor' ...

function calctime($seconds = 0) {

    $datetime1 = date_create("@0");
    $datetime2 = date_create("@$seconds");
    $interval = date_diff($datetime1, $datetime2);

    if ( $interval->y >= 1 ) $thetime[] = pluralize( $interval->y, 'year' );
    if ( $interval->m >= 1 ) $thetime[] = pluralize( $interval->m, 'month' );
    if ( $interval->d >= 1 ) $thetime[] = pluralize( $interval->d, 'day' );
    if ( $interval->h >= 1 ) $thetime[] = pluralize( $interval->h, 'hour' );
    if ( $interval->i >= 1 ) $thetime[] = pluralize( $interval->i, 'minute' );
    if ( $interval->s >= 1 ) $thetime[] = pluralize( $interval->s, 'second' );

    return $thetime ? implode(' ', $thetime) . ($interval->invert ? ' ago' : '') : NULL;
}

function pluralize($count, $text) {
    return $count . ($count == 1 ? " $text" : " ${text}s");
}

// Examples:
//    -86400 = 1 day ago
//     12345 = 3 hours 25 minutes 45 seconds
// 987654321 = 31 years 3 months 18 days 4 hours 25 minutes 21 seconds

BEARBEITEN: Wenn Sie das obige Beispiel auf weniger Variablen / Speicherplatz reduzieren möchten (auf Kosten der Lesbarkeit), finden Sie hier eine alternative Version, die dasselbe tut:

function calctime($seconds = 0) {
    $interval = date_diff(date_create("@0"),date_create("@$seconds"));

    foreach (array('y'=>'year','m'=>'month','d'=>'day','h'=>'hour','i'=>'minute','s'=>'second') as $format=>$desc) {
        if ($interval->$format >= 1) $thetime[] = $interval->$format . ($interval->$format == 1 ? " $desc" : " {$desc}s");
    }

    return $thetime ? implode(' ', $thetime) . ($interval->invert ? ' ago' : '') : NULL;
}
Jason
quelle
0

Ich bearbeite einen der Codes, damit er gut funktioniert, wenn ein negativer Wert auftritt. floor()Die Funktion gibt nicht die richtige Anzahl an, wenn der Wert negativ ist. Wir müssen also die abs()Funktion verwenden, bevor wir sie in der floor()Funktion verwenden können. $inputSecondsVariable kann die Differenz zwischen dem aktuellen Zeitstempel und dem erforderlichen Datum sein.

/** 
 * Convert number of seconds into hours, minutes and seconds 
 * and return an array containing those values 
 * 
 * @param integer $inputSeconds Number of seconds to parse 
 * @return array 
 */ 

function secondsToTime($inputSeconds) {

    $secondsInAMinute = 60;
    $secondsInAnHour  = 60 * $secondsInAMinute;
    $secondsInADay    = 24 * $secondsInAnHour;

    // extract days
    $days = abs($inputSeconds / $secondsInADay);
    $days = floor($days);

    // extract hours
    $hourSeconds = $inputSeconds % $secondsInADay;
    $hours = abs($hourSeconds / $secondsInAnHour);
    $hours = floor($hours);

    // extract minutes
    $minuteSeconds = $hourSeconds % $secondsInAnHour;
    $minutes = abs($minuteSeconds / $secondsInAMinute);
    $minutes = floor($minutes);

    // extract the remaining seconds
    $remainingSeconds = $minuteSeconds % $secondsInAMinute;
    $seconds = abs($remainingSeconds);
    $seconds = ceil($remainingSeconds);

    // return the final array
    $obj = array(
        'd' => (int) $days,
        'h' => (int) $hours,
        'm' => (int) $minutes,
        's' => (int) $seconds,
    );
    return $obj;
}
Thomas Mathew
quelle
0

Eine Variation der Antwort von @ Glavić - diese versteckt führende Nullen für kürzere Ergebnisse und verwendet Pluralformen an den richtigen Stellen. Außerdem wird unnötige Präzision beseitigt (z. B. wenn der Zeitunterschied mehr als 2 Stunden beträgt, ist es Ihnen wahrscheinlich egal, wie viele Minuten oder Sekunden).

function secondsToTime($seconds)
{
    $dtF = new \DateTime('@0');
    $dtT = new \DateTime("@$seconds");
    $dateInterval = $dtF->diff($dtT);
    $days_t = 'day';
    $hours_t = 'hour';
    $minutes_t = 'minute';
    $seconds_t = 'second';
    if ((int)$dateInterval->d > 1) {
        $days_t = 'days';
    }
    if ((int)$dateInterval->h > 1) {
        $hours_t = 'hours';
    }
    if ((int)$dateInterval->i > 1) {
        $minutes_t = 'minutes';
    }
    if ((int)$dateInterval->s > 1) {
        $seconds_t = 'seconds';
    }


    if ((int)$dateInterval->d > 0) {
        if ((int)$dateInterval->d > 1 || (int)$dateInterval->h === 0) {
            return $dateInterval->format("%a $days_t");
        } else {
            return $dateInterval->format("%a $days_t, %h $hours_t");
        }
    } else if ((int)$dateInterval->h > 0) {
        if ((int)$dateInterval->h > 1 || (int)$dateInterval->i === 0) {
            return $dateInterval->format("%h $hours_t");
        } else {
            return $dateInterval->format("%h $hours_t, %i $minutes_t");
        }
    } else if ((int)$dateInterval->i > 0) {
        if ((int)$dateInterval->i > 1 || (int)$dateInterval->s === 0) {
            return $dateInterval->format("%i $minutes_t");
        } else {
            return $dateInterval->format("%i $minutes_t, %s $seconds_t");
        }
    } else {
        return $dateInterval->format("%s $seconds_t");
    }

}
php > echo secondsToTime(60);
1 minute
php > echo secondsToTime(61);
1 minute, 1 second
php > echo secondsToTime(120);
2 minutes
php > echo secondsToTime(121);
2 minutes
php > echo secondsToTime(2000);
33 minutes
php > echo secondsToTime(4000);
1 hour, 6 minutes
php > echo secondsToTime(4001);
1 hour, 6 minutes
php > echo secondsToTime(40001);
11 hours
php > echo secondsToTime(400000);
4 days
Mike Furlender
quelle
-1
foreach ($email as $temp => $value) {
    $dat = strtotime($value['subscription_expiration']); //$value come from mysql database
//$email is an array from mysqli_query()
    $date = strtotime(date('Y-m-d'));

    $_SESSION['expiry'] = (((($dat - $date)/60)/60)/24)." Days Left";
//you will get the difference from current date in days.
}

$ value stammen aus der Datenbank. Dieser Code befindet sich in Codeigniter. $ SESSION wird zum Speichern von Benutzerabonnements verwendet. es zwingend erforderlich ist. Ich habe es in meinem Fall verwendet, Sie können verwenden, was Sie wollen.

Tayyab Hayat
quelle
1
Können Sie Ihrem Code weitere Erklärungen hinzufügen? Woher kommt $valuedas? Warum haben Sie eine Sitzung vorgestellt? Wie wird die richtige Zeichenfolge für Sekunden, Minuten und Stunden zurückgegeben?
Nico Haase
@NicoHaase Antwort Aktualisiert.
Tayyab Hayat
-2

Dies ist eine Funktion, die ich in der Vergangenheit verwendet habe, um ein Datum von einem anderen zu entfernen, das mit Ihrer Frage zusammenhängt. Mein Prinzip bestand darin, zu ermitteln, wie viele Tage, Stunden, Minuten und Sekunden bis zum Ablauf eines Produkts noch übrig sind:

$expirationDate = strtotime("2015-01-12 20:08:23");
$toDay = strtotime(date('Y-m-d H:i:s'));
$difference = abs($toDay - $expirationDate);
$days = floor($difference / 86400);
$hours = floor(($difference - $days * 86400) / 3600);
$minutes = floor(($difference - $days * 86400 - $hours * 3600) / 60);
$seconds = floor($difference - $days * 86400 - $hours * 3600 - $minutes * 60);

echo "{$days} days {$hours} hours {$minutes} minutes {$seconds} seconds";
Krazii KiiD
quelle