Convertir les secondes en jours, heures, minutes et secondes


92

Je voudrais convertir une variable $uptimequi est secondes, en jours, heures, minutes et secondes.

Exemple:

$uptime = 1640467;

Le résultat doit être:

18 days 23 hours 41 minutes

Réponses:


214

Cela peut être réalisé avec la DateTimeclasse

Utilisation:

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

Fonction:

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ć Comment pourrais-je ajouter un support hebdomadaire et mensuel à cela?
socca1157

2
Assurez-vous d'ajouter une validation à la fonction. if (empty ($ seconds)) {return false;}
un codeur

4
@acoder: Je pense que cette fonction ne devrait pas prendre en charge la validation; la validation doit être configurée avant l'appel de la fonction. Néanmoins, votre validation est toujours erronée, car par exemple elle passera également l'alphabet.
Glavić

2
Qu'est-ce que cela @signifie lorsqu'il est passé en argument au DateTimeconstructeur?
Ivanka Todorova

4
@IvankaTodorova: la valeur après @est l'horodatage unix.
Glavić

44

Il s'agit de la fonction réécrite pour inclure les jours. J'ai également changé les noms des variables pour rendre le code plus facile à comprendre ...

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

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


Ce serait bien d'inclure la source
Martin.

auriez-vous la gentillesse d'ajouter des jours à cette fonction?
knittledan

@knittledan, n'apparaît pas ainsi :)
AO_

1
@ hsmoore.com Je suis allé de l'avant et j'ai compris cela $ days = floor ($ seconds / (60 * 60 * 24)); // extraire les heures $ divisor_for_hours = $ secondes% (60 * 60 * 24); $ heures = plancher ($ divisor_for_hours / (60 * 60));
knittledan

1
Cela ne fonctionne pas comme prévu pendant des jours. Vous devez soustraire ($ jours * 24) de $ heures, sinon les heures dans les jours seront comptées deux fois en $ jours et $ heures. Par exemple, entrez 100000 => 1 jour et 27 heures. Cela devrait durer 1 jour et 3 heures.
finiteloop

30

Basé sur la réponse de Julian Moreno, mais modifié pour donner la réponse sous forme de chaîne (pas de tableau), n'incluez que les intervalles de temps requis et ne supposez pas le pluriel.

La différence entre cette réponse et la réponse la plus élevée est:

Pendant 259264quelques secondes, ce code donnerait

3 jours, 1 minute, 4 secondes

Pendant 259264quelques secondes, la réponse la plus votée (par Glavić) donnerait

3 jours, 0 heure , 1 minute et 4 secondes

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

J'espère que ça aidera quelqu'un.


1
Je préfère celui-ci car il supprime le "s", de "1 heure", et, dans mon cas, je voulais supprimer des jours et avoir juste un grand nombre d'heures, et cette méthode était très facile à adapter à cela <3.
Ryan S

1
Très beau Luke, en le gardant compact et propre!
VoidZA

19

Voici une simple fonction PHP de 8 lignes qui convertit un certain nombre de secondes en une chaîne lisible par l'homme, y compris le nombre de mois pour de grandes quantités de secondes:

Fonction PHP seconds2human ()

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

2
Simple mais efficace. Même si je n'aimais pas le morceau «Mois».
Francisco Presencia

1
Vous devez inclure du code dans votre réponse, pas un lien vers une autre page. Il n'y a aucun moyen de s'assurer que le site Web auquel vous
créez un

11
gmdate("d H:i:s",1640467);

Le résultat sera 19 23:41:07. Lorsqu'il ne reste qu'une seconde de plus qu'un jour normal, cela augmente la valeur du jour pendant 1 jour. C'est pourquoi il affiche 19. Vous pouvez exploser le résultat pour vos besoins et résoudre ce problème.


Vous pouvez également améliorer ce code comme ceci: $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];Cela vous donnera également des informations sur l'année et le mois.
Caner SAYGIN

Pour éviter l'erreur +1 jour, soustrayez simplement (24 * 60 * 60) de l'horodatage source en secondes.
andreszs le

9

Il y a de très bonnes réponses ici mais aucune d'entre elles ne répondait à mes besoins. J'ai construit sur la réponse de Glavic pour ajouter quelques fonctionnalités supplémentaires dont j'avais besoin;

  • N'imprimez pas de zéros. Donc "5 minutes" au lieu de "0 heure, 5 minutes"
  • Gérez correctement le pluriel au lieu de passer par défaut au pluriel.
  • Limitez la sortie à un nombre défini d'unités; Donc "2 mois, 2 jours" au lieu de "2 mois, 2 jours, 1 heure, 45 minutes"

Vous pouvez voir une version en cours d'exécution du code 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;
}

1
ça m'a beaucoup aidé
Manojkiran.A

Je vais créer la fonction en fonction de votre manière
laravel

8

Court, simple, fiable:

function secondsToDHMS($seconds) {
    $s = (int)$seconds;
    return sprintf('%d:%02d:%02d:%02d', $s/86400, $s/3600%24, $s/60%60, $s%60);
}

3
Des explications supplémentaires iraient très loin dans cette réponse, comme ce que représentent les constantes entières et comment le formatage des chaînes fonctionne avec sprintf.

1
Je ferais sprintf ('% dd:% 02dh:% 02dm:% 02ds', $ s / 86400, $ s / 3600% 24, $ s / 60% 60, $ s% 60); juste pour être encore plus humain (ex: 0d: 00h: 05m: 00s). Mais probablement la meilleure solution ici.
Ricardo Martins

6

L'approche la plus simple serait de créer une méthode qui renvoie un DateInterval à partir de DateTime :: diff de l'heure relative en $ secondes à partir de l'heure actuelle $ now que vous pouvez ensuite enchaîner et formater. Par exemple:-

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

Maintenant, chaînez votre appel de méthode à DateInterval :: format

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

Résultat:

18 days 23 hours 41 minutes

3

Bien que ce soit une question assez ancienne - on peut les trouver utiles (pas écrites pour être rapides):

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

résultat:

0d21h57m13s
21h57m13s
9d21h57m13s

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

1
Vous manquez des jours
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);

2

Solution qui devrait exclure les valeurs 0 et définir des valeurs singulières / plurielles correctes

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

1

une version étendue de l'excellente solution de Glavić , ayant une validation entière, résolvant le problème 1 s et un support supplémentaire pendant des années et des mois, au détriment d'être moins convivial pour l'analyse informatique au profit d'être plus convivial:

<?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"


1

La classe d'intervalle que j'ai écrite peut être utilisée. Il peut également être utilisé de manière opposée.

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

Plus d'infos ici https://github.com/LubosRemplik/CakePHP-Interval


1

Avec 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

0

Voici un code que j'aime utiliser pour obtenir la durée entre deux dates. Il accepte deux dates et vous donne une belle réponse structurée en phrases.

Ceci est une version légèrement modifiée du code trouvé ici .

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

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


0

Le tout en une seule solution. Ne donne aucune unité avec des zéros. Ne produira que le nombre d'unités que vous spécifiez (3 par défaut). Assez long, peut-être pas très élégant. Les définitions sont facultatives, mais peuvent s'avérer utiles dans un grand projet.

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

N'hésitez pas à voter contre, mais assurez-vous de l'essayer dans votre code. C'est peut-être ce dont vous avez besoin.


0

La solution pour celui-ci que j'ai utilisée (à l'époque en apprenant PHP) sans aucune fonction intégrée:

$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";

Bien que ce soit une vieille question, les nouveaux apprenants qui rencontrent cette question peuvent trouver cette réponse utile.


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)

0

J'édite l'un des codes pour qu'il fonctionne bien lorsque la valeur négative vient. floor()La fonction ne donne pas le compte correct lorsque la valeur est négative. Nous devons donc utiliser la abs()fonction avant de l'utiliser dans la floor()fonction. $inputSecondsvariable peut être la différence entre l'horodatage actuel et la date requise.

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

0

Une variante de la réponse de @ Glavić - celle-ci masque les zéros non significatifs pour des résultats plus courts et utilise des pluriels aux bons endroits. Cela supprime également les précisions inutiles (par exemple, si le décalage horaire est supérieur à 2 heures, vous ne vous souciez probablement pas du nombre de minutes ou de secondes).

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

0

Je ne sais pas pourquoi certaines de ces réponses sont ridiculement longues ou complexes. En voici un qui utilise la classe DateTime . Un peu similaire à la réponse de radzserg. Cela n'affichera que les unités nécessaires, et les temps négatifs auront le suffixe `` il y a '' ...

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 isset($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

EDIT: Si vous souhaitez condenser l'exemple ci-dessus pour utiliser moins de variables / d'espace (au détriment de la lisibilité), voici une version alternative qui fait la même chose:

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 isset($thetime) ? implode(' ', $thetime) . ($interval->invert ? ' ago' : '') : NULL;
}

Vous souhaiterez peut-être ajouter de la sécurité à la fonction calctime pour vous protéger contre 0 seconde. Le code actuel génère une erreur. Enveloppez-vous $thetimedans le retour, par exempleisset($thetime)
Stargazing Worm

Merci pour la suggestion, vous avez raison sur l'erreur (je ne peux pas croire que j'ai manqué cela). J'ai mis à jour le code en conséquence!
Jason

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

La valeur $ provient de la base de données. Ce code est dans Codeigniter. $ SESSION est utilisé pour stocker les abonnements des utilisateurs. c'est obligatoire. Je l'ai utilisé dans mon cas, vous pouvez utiliser ce que vous voulez.


1
Pouvez-vous ajouter plus d'explications à votre code? D'où $valuevient-il? Pourquoi avez-vous voulu introduire une session? Comment cela renvoie-t-il la chaîne appropriée pour les secondes, les minutes et les heures?
Nico Haase

Réponse @NicoHaase mise à jour.
Tayyab Hayat

-2

C'est une fonction que j'ai utilisée dans le passé pour soustraire une date à une autre liée à votre question, mon principe était de savoir combien de jours, heures, minutes et secondes il reste jusqu'à ce qu'un produit expire:

$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";

comment obtenir le nombre de semaines aussi? exemple: 5 secondes, 1 heure, 3 jours, 2 semaines, 1 mois
Stackoverflow
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.