2009-12-02 5 views

Répondre

32

Ne pas tomber dans le piège d'utiliser les fonctions de date pour cela! Ce que vous avez ici est un intervalle de temps, pas une date. L'approche naïve est de faire quelque chose comme ceci:

date("h:i:s.u", $mytime/1000) 

mais parce que la fonction de la date est utilisée pour (gasp!) Dates, il ne gère pas le temps de la façon que vous le voulez dans cette situation - il faut les fuseaux horaires et l'heure d'été, etc., sont pris en compte lors du formatage d'une date/heure.

Au lieu de cela, vous voudrez probablement juste faire quelques mathématiques simples:

$input = 70135; 

$uSec = $input % 1000; 
$input = floor($input/1000); 

$seconds = $input % 60; 
$input = floor($input/60); 

$minutes = $input % 60; 
$input = floor($input/60); 

// and so on, for as long as you require. 
+0

Nous avions tort, vous avez raison;) ++ 1 –

+0

Ce serait toujours un hack, mais vous pouvez utiliser 'gmdate()' si vous êtes sûr que vos valeurs seront inférieures à 24 heures. – soulmerge

+0

Parfait! Merci un million! – designvoid

1

Essayez cette fonction pour afficher quantité de millisecondes comme vous le souhaitez:

<?php 
function udate($format, $utimestamp = null) 
{ 
    if (is_null($utimestamp)) { 
     $utimestamp = microtime(true); 
    } 

    $timestamp = floor($utimestamp); 
    $milliseconds = round(($utimestamp - $timestamp) * 1000000); 

    return date(preg_replace('`(?<!\\\\)u`', sprintf("%06u", $milliseconds), $format), $timestamp); 
} 

echo udate('H:i:s.u'); // 19:40:56.78128 
echo udate('H:i:s.u', 654532123.04546); // 16:28:43.045460 
?> 

Source

+0

@Kamil - J'inline le code de sorte qu'il est ici pour la postérité. –

+0

btw - Je n'ai aucune idée de ce que fait 'preg_replace'. Ça a l'air plutôt étrange. –

+1

@Dominic - Merci. Je le ferai la prochaine fois. –

1

Je crois qu'il n'y a pas de fonction intégrée pour miliseconds de mise en forme PHP, vous aurez besoin d'utiliser les mathématiques .

0

Comme mentionné dans le manuel:

u microsecondes (ajouté en PHP 5.2.2) Exemple: 654321

Nous avons un paramètre 'u' pour la fonction date()

Exemple:

if(($u/60) >= 60) 
{ 
$u = mktime(0,($u/360)); 
} 
date('H:i:s',$u); 
4

Si vous utilisez P HP 5.3, vous pouvez utiliser l'objet DateInterval:

list($seconds, $millis) = explode('.', $milliseconds/1000); 
$range = new DateInterval("PT{$seconds}S"); 
echo $range->format('%H:%I:%S') . ':' . str_pad($millis, 3, '0', STR_PAD_LEFT); 
+0

Comment obtenez-vous $ secondes? Vous devez convertir $ millis en $ secondes, n'est-ce pas? –

+0

@daemonfire: Thx pour signaler. Devrait fonctionner maintenant. – soulmerge

+1

Si vous utilisez 70370 comme $ millisecondes ici vous obtenez 00: 00: 70: 037 ... ne devrait pas 70 secondes ajouter 1 minute? – barfoon

1

pourquoi embêter avec date() et la mise en forme lorsque vous pouvez simplement utiliser les mathématiques? si $ms est votre nombre de millisecondes

echo floor($ms/60000).':'.floor(($ms%60000)/1000).':'.str_pad(floor($ms%1000),3,'0', STR_PAD_LEFT);