obtenir le format de date m-d-Y H:i:s.u à partir de millisecondes
J'essaie d'obtenir une date formatée, y compris les microsecondes de millisecondes.
Le seul problème est que je continue à obtenir 000000
date("m-d-Y H:i:s.u", $milliseconds/1000);
Ex. 07-28-2013 11:26:14.000000
13 réponses
Php.net dit:
Microsecondes (ajouté en PHP 5.2.2). Notez que
date()
générera toujours000000
car il prend un paramètre entier, alors queDateTime::format()
prend en charge les microsecondes siDateTime
a été créé avec des microsecondes.
Donc utiliser aussi simple:
$micro_date = microtime();
$date_array = explode(" ",$micro_date);
$date = date("Y-m-d H:i:s",$date_array[1]);
echo "Date: $date:" . $date_array[0]."<br>";
Recommandé et utiliser dateTime()
classe de référence:
$t = microtime(true);
$micro = sprintf("%06d",($t - floor($t)) * 1000000);
$d = new DateTime( date('Y-m-d H:i:s.'.$micro, $t) );
print $d->format("Y-m-d H:i:s.u"); // note at point on "u"
Note u
est une microseconde (1 seconde = 1000000 µs).
Un autre exemple de php.net :
$d2=new DateTime("2012-07-08 11:14:15.889342");
Référence de dateTime()
sur php.net
j'ai répondu à la question aussi courte et simplifier à l'auteur. Veuillez consulter pour plus d'informations à l'auteur: obtenir le format de date m-d-Y H:i:s.u à partir de millisecondes
, Vous pouvez facilement faire cela avec le format d'entrée U.u
.
$now = DateTime::createFromFormat('U.u', microtime(true));
echo $now->format("m-d-Y H:i:s.u");
Cela produit la sortie suivante:
04-13-2015 05:56:22.082300
De la page de manuel PHP pour les formats de date:
- U = secondes depuis L'époque Unix
- u = microsecondes
Http://php.net/manual/en/function.date.php
Merci à giggsey d'avoir signalé une faille dans ma réponse originale, en ajoutant number_format()
à la ligne devrait corriger le cas de la seconde exacte. Dommage que ça ne soit plus aussi élégant...
$now = DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', ''));
Http://php.net/manual/en/function.number-format.php
Une note sur les fuseaux horaires en réponse à DaVe.
Normalement, la méthode createFromFormat()
utilisera le fuseau horaire local si celui-ci n'est pas spécifié.
Http://php.net/manual/en/datetime.createfromformat.php
Cependant, la technique décrite ici est d'initialiser L'objet DateTime en utilisant microtime()
qui renvoie le nombre de secondes écoulées depuis L'époque Unix (01 Jan 1970 00: 00: 00 GMT).
Http://php.net/manual/en/function.microtime.php
Cela signifie que L'objet DateTime est implicitement initialisé en UTC, ce qui est bien pour les tâches internes du serveur qui veulent juste suivre le temps écoulé.
Si vous devez afficher l'heure pour un fuseau horaire particulier, vous devez la définir en conséquence. Toutefois, cela devrait être fait comme une étape distincte après l'initialisation (pas en utilisant le troisième paramètre de createFromFormat()
) en raison des raisons discutées ci-dessus.
La méthode setTimeZone()
peut être utilisée pour accomplir cette exigence.
Http://php.net/manual/en/datetime.settimezone.php
À titre d'exemple:
$now = DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', ''));
echo $now->format("m-d-Y H:i:s.u") . '<br>';
$local = $now->setTimeZone(new DateTimeZone('Australia/Canberra'));
echo $local->format("m-d-Y H:i:s.u") . '<br>';
Produit la sortie suivante:
10-29-2015 00:40:09.433818
10-29-2015 11:40:09.433818
Notez que si vous voulez entrer dans mysql, le format d'heure doit être:
format("Y-m-d H:i:s.u")
Voici une approche légèrement plus courte. Plutôt que de travailler pour créer une date/heure numérique de haute précision, Je convertit la valeur de la microseconde en une chaîne, supprime le 0
et l'ajoute à la fin de la chaîne de date/heure. Je peux facilement réduire le nombre de décimales en ajustant le paramètre de longueur de chaîne; ici, j'utilise 4
pour obtenir des millisecondes, mais vous pouvez utiliser 7
pour obtenir des microsecondes.
$t = explode(" ",microtime());
echo date("m-d-y H:i:s",$t[1]).substr((string)$t[0],1,4);
Pour une valeur microtime () de 0.98236000 1407400573
, cela renvoie 08-07-14 01:08:13.982
.
Je suis l'utiliser
echo date("Y-m-d H:i:s.").gettimeofday()["usec"];
output: 2017-09-05 17:04:57.555036
Restez simple
echo date('m-d-Y H:i:').(date('s')+fmod(microtime(true), 1));
// Procedural
$fineStamp = date('Y-m-d\TH:i:s') . substr(microtime(), 1, 9);
echo $fineStamp . PHP_EOL;
// Object-oriented (if you must). Still relies on $fineStamp though :-\
$d = new DateTime($fineStamp);
echo $d->format('Y-m-d\TH:i:s.u') . PHP_EOL;
Si vous voulez formater une date comme celle de JavaScript (new Date()).toISOString()
pour une raison quelconque, voici comment vous pouvez le faire en PHP:
$now = microtime(true);
gmdate('Y-m-d\TH:i:s', $now).sprintf('.%03dZ',round(($now-floor($now))*1000));
Exemple de sortie:
2016-04-27T18:25:56.696Z
Juste pour prouver que soustraire le nombre entier ne réduit pas la précision de la partie décimale:
>>> number_format(123.01234567890123456789,25)
=> "123.0123456789012408307826263"
>>> number_format(123.01234567890123456789-123,25)
=> "0.0123456789012408307826263"
PHP a fait arrondir les décimales, mais il les a arrondies de la même manière dans les deux cas.
Ceci est basé sur la réponse de ArchCodeMonkey.
Mais juste simplifié, si vous voulez juste quelque chose de rapide qui fonctionne.
function DateTime_us_utc(){
return DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', ''));
}
function DateTime_us(){
$now = DateTime_us_utc();
return $now->setTimeZone(new DateTimeZone(date_default_timezone_get()));
}
Donc, pour moi, alors
$now = DateTime_us();
$now->format("m-d-Y H:i:s.u");
Voici une autre méthode que je trouve un peu plus élégante / simple:
echo date('Y-m-d-H:i:s.').preg_replace("/^.*\./i","", microtime(true));
La documentation indique ce qui suit:
Microsecondes (ajouté en PHP 5.2.2). Notez que date() sera toujours générer 000000 car il prend un paramètre entier, alors que DateTime::format() prend en charge les microsecondes.
C'est-à-dire, utilisez DateTime à la place.
Avec PHP 7.0 + maintenant ici vous pouvez faire ce qui suit:
$dateString = substr($millseconds_go_here,0,10);
$drawDate = new \DateTime(Date('Y-m-d H:i',$dateString));
$drawDate->setTimezone(new \DateTimeZone('UTC'));
Cela fait ce qui suit dans l'ordre:
- coupe les 4 derniers zéros de la chaîne afin que {[1] } puisse gérer la date.
- utilise date pour formater les millisecondes en une chaîne date-heure que DateTime peut comprendre.
-
DateTime()
peut alors vous permettre de modifier le fuseau horaire où vous vous trouvez, mais assurez -date_default_timezone_set("Timezone");
est installé avant d'utiliserDateTime()
de fonctions et de classes. - Il est recommandé d'utiliser un constructeur dans vos classes pour vous assurer que vous êtes dans le fuseau horaire correct lorsque
DateTime()
classes ou fonctions sont utilisées.
Depuis PHP 7.1, vous pouvez simplement faire ceci:
$date = new DateTime( "NOW" );
echo $date->format( "m-d-Y H:i:s.u" );
, Il s'affiche comme:
04-11-2018 10:54:01.321688
Si vous utilisez Carbon, vous pouvez utiliser la spécification définie "RFC3339_EXTENDED". ou le personnaliser.
Carbon::RFC3339_EXTENDED = 'Y-m-d\TH:i:s.vP';