2010-06-01 10 views
3

Bonjour à ma date de base de données/heure sont dans ce formatdate/heure convertir en temps depuis php

2010-06-01T18:20:25+0000 

J'aimerais faire écho que sur le temps écoulé depuis cette date/heure

par exemple

4 jours 3 heures 36 minutes et 4 secondes

est-ce possible?

Répondre

4

Voici une fonction que j'ai écrite pour cela. Sentez-vous libre de l'utiliser.

/** 
* Returns rough (in largest single unit) time elapsed between two times. 
* @param int $iTime0 Initial time, as time_t. 
* @param int $iTime1 Final time, as time_t. 0=use current time. 
* @return string Time elapsed, like "5 minutes" or "3 days" or "1 month". 
*    You might print "ago" after this return if $iTime1 is now. 
* @author Dan Kamins - dos at axonchisel dot net 
*/ 
function ax_getRoughTimeElapsedAsText($iTime0, $iTime1 = 0) 
{ 
    if ($iTime1 == 0) { $iTime1 = time(); } 
    $iTimeElapsed = $iTime1 - $iTime0; 

    if ($iTimeElapsed < (60)) { 
     $iNum = intval($iTimeElapsed); $sUnit = "second"; 
    } else if ($iTimeElapsed < (60*60)) { 
     $iNum = intval($iTimeElapsed/60); $sUnit = "minute"; 
    } else if ($iTimeElapsed < (24*60*60)) { 
     $iNum = intval($iTimeElapsed/(60*60)); $sUnit = "hour"; 
    } else if ($iTimeElapsed < (30*24*60*60)) { 
     $iNum = intval($iTimeElapsed/(24*60*60)); $sUnit = "day"; 
    } else if ($iTimeElapsed < (365*24*60*60)) { 
     $iNum = intval($iTimeElapsed/(30*24*60*60)); $sUnit = "month"; 
    } else { 
     $iNum = intval($iTimeElapsed/(365*24*60*60)); $sUnit = "year"; 
    } 

    return $iNum . " " . $sUnit . (($iNum != 1) ? "s" : ""); 
} 

Pour utiliser cette Func, vous aurez besoin d'abord convertir votre temps au format time_t (#seconds entier depuis la « époque »). L'une ou l'autre de ces fonctions PHP va probablement aider avec cela: http://php.net/strptime ou http://php.net/strtotime.

+0

La question a été modifiée depuis que j'ai posté ceci ... Ma fonction ne produit que les unités de temps les plus volumineuses, ce qui intéresse souvent l'utilisateur et ce que la question initiale semblait poser. – dkamins

+0

Merci mon pote j'ai réussi à convertir en horodatage comme vous l'avez dit cependant le résultat est juste "7 jours" il ne sort pas les minutes etc? – Webby

+0

@Webby, comme je l'ai dit, il ne sort que le plus gros morceau de temps. Si le temps est compris entre 61 secondes et 59 minutes + 59 secondes, il affichera "minutes" (et seulement quelques minutes). – dkamins

-1

u peut chercher que Fron db et utiliser la fonction strtotime qui va faire époque. puis utilisez la commande date pour l'imprimer dans n'importe quel format.

+0

y est-ce négatif marqué. Je pense que ma solution est correcte. – Hacker

+0

Votre solution n'a rien à voir avec le temps écoulé entre deux temps, ce qui est demandé ici. –

1
function time_ago($timestamp, $granularity = 2) { 
    $timestamp = time() - $timestamp; 
    $units = array('1 year|%d years' => 31536000, 
       '1 week|%d weeks' => 604800, 
       '1 day|%d days' => 86400, 
       '1 hour|%d hours' => 3600, 
       '1 min|%d mins' => 60, 
       '1 sec|%d secs' => 1 
       ); 
    $output = ''; 
    foreach ($units as $key => $value) { 
    $key = explode('|', $key); 
    if ($timestamp >= $value) { 
     $pluralized = floor($timestamp/$value) > 1 ? 
        sprintf($key[1], floor($timestamp/$value)) : 
        $key[0]; 
     $output .= ($output ? ' ' : '') . $pluralized; 
     $timestamp %= $value; 
     $granularity--; 
    } 
    if ($granularity == 0) { 
     break; 
    } 
    } 
    return $output ? $output : "Just now"; 
} 

Cela devrait être proche.

Modifier: a ajouté cette ligne: $ timestamp = time() - $ timestamp;

+0

Je peux avoir l'air de faire fonctionner cette fonction? en cours d'essai: $ c = fonction time_ago ("1274744330", "2"); echo "$ c
"; ai-je tort? merci beaucoup – Webby

+0

C'est faux. $ c = time_ago ("1274744330", "2"); echo "$ c
"; (Remarquez l'absence du mot-clé "function"?) Je reçois: 40 années 21 semaines – Entendu

+0

Oui, réalisé 40 ans était faux. J'ai oublié un calcul, la réponse est éditée. Maintenant, je reçois 1 semaine 21 heures avec granularité 2 et 1 semaine 21 heures 37 minutes 24 secondes avec une granularité complète. – Entendu

2

J'ai changé une ligne du code ci-dessus pour le cas où il a été posté il y a moins d'une minute.

function ax_getRoughTimeElapsedAsText($iTime0, $iTime1 = 0) 
    { 
    if ($iTime1 == 0) { $iTime1 = time(); } 
    $iTimeElapsed = $iTime1 - $iTime0; 

    if ($iTimeElapsed < (60)) { 
     return "Less than a minute ago"; 
    } else if ($iTimeElapsed < (60*60)) { 
     $iNum = intval($iTimeElapsed/60); $sUnit = "minute"; 
    } else if ($iTimeElapsed < (24*60*60)) { 
     $iNum = intval($iTimeElapsed/(60*60)); $sUnit = "hour"; 
    } else if ($iTimeElapsed < (30*24*60*60)) { 
     $iNum = intval($iTimeElapsed/(24*60*60)); $sUnit = "day"; 
    } else if ($iTimeElapsed < (365*24*60*60)) { 
     $iNum = intval($iTimeElapsed/(30*24*60*60)); $sUnit = "month"; 
    } else { 
     $iNum = intval($iTimeElapsed/(365*24*60*60)); $sUnit = "year"; 
    } 

    return $iNum . " " . $sUnit . (($iNum != 1) ? "s" : "") . " ago"; 
    }