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

88
php
demandé sur slik 2013-07-28 19:35:25

13 réponses

Php.net dit:

Microsecondes (ajouté en PHP 5.2.2). Notez que date() générera toujours 000000 car il prend un paramètre entier, alors que DateTime::format() prend en charge les microsecondes si DateTime 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

107
répondu Marin Sagovac 2018-08-20 10:38:39

, 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")
91
répondu ArchCodeMonkey 2018-04-04 05:22:50

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.

12
répondu thotso 2014-08-08 03:28:27

Je suis l'utiliser

echo date("Y-m-d H:i:s.").gettimeofday()["usec"];

output: 2017-09-05 17:04:57.555036
5
répondu bamossza 2017-09-05 15:12:24

Restez simple

echo date('m-d-Y H:i:').(date('s')+fmod(microtime(true), 1));
4
répondu ghbarratt 2017-06-02 15:18:29
// 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;
1
répondu Geo 2014-10-25 16:59:45

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.

1
répondu mpen 2016-05-20 22:24:32

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");
1
répondu John Kearney 2017-02-10 21:26:54

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));
1
répondu SDpyro 2018-05-17 00:59:01

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.

0
répondu Havsmonstret 2013-07-28 15:37:25

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:

  1. coupe les 4 derniers zéros de la chaîne afin que {[1] } puisse gérer la date.
  2. utilise date pour formater les millisecondes en une chaîne date-heure que DateTime peut comprendre.
  3. 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'utiliser DateTime() de fonctions et de classes.
  4. 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.
0
répondu Jamie Ross 2018-01-31 17:21:42

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
0
répondu Harveyhase68 2018-04-11 09:37:20

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';
0
répondu Aiden Moon 2018-05-31 06:08:50