C'est bizarre que la question demande la conversion des millisecondes , mais tout le monde répond comment convertir les microsecondes. Je sais que vous pouvez convertir entre les deux, mais répondre à la question au lieu de copier et coller du code non lié à partir du doc PHP ou ailleurs serait bien.
laurent
Je sais que cela fait un moment, mais la réponse de bamossza était la meilleure que j'ai trouvée ici
Microsecondes (ajouté dans PHP 5.2.2). Notez que date()cela générera toujours 000000car il prend un paramètre entier, alors qu'il DateTime::format()prend en charge les microsecondes s'il a DateTimeété créé avec des microsecondes.
J'opte généralement pour le deuxième formulaire car il est plus facile à lire et à comprendre. De plus, DateTime est beaucoup plus flexible et robuste que les fonctions date / heure. La gestion des microsecondes est un cas d'espèce.
Herbert
3
@Geo et AlBundy pourrait-il être que vous essayez ceci sur une machine avec php <5.2.2? PHP 5.4.39 fonctionne parfaitement bien ...
RichardBernards
ne serait-ce pas facile? date ('mdY H: i: s'). (int) microtime (vrai);
Anant
@Anant, ce serait assez facile, en effet. Mais faux. ;) Ce que vous obtenez là n'est que l'époque en secondes. (Malheureusement, cela ne fonctionnerait pas non microtime(false)plus.)
Sz.
Ce code ne fonctionne pas correctement sur tous les paramètres régionaux. Certains pays comme l'Allemagne écrivent "0,1234" ou "0,1234" au lieu de ".1234", donc votre code donne la sortie suivante pour moi: 2012-07-08 11:14:15.0.889342
Daniel Marschall
138
Vous pouvez facilement le faire avec le format d'entrée U.u.
Merci à Giggsey d'avoir signalé une faille dans ma réponse originale, l'ajout number_format()à la ligne devrait corriger le cas de la seconde exacte. Dommage qu'il ne soit plus aussi élégant ...
Cependant, la technique décrite ici consiste à initialiser l'objet DateTime en utilisant microtime()qui renvoie le nombre de secondes écoulées depuis l'époque Unix (01 janvier 1970 00:00:00 GMT).
Cela signifie que l'objet DateTime est implicitement initialisé à UTC, ce qui convient parfaitement aux tâches internes du serveur qui souhaitent simplement suivre le temps écoulé.
Si vous avez besoin d'afficher l'heure pour un fuseau horaire particulier, vous devez le régler en conséquence. Cependant, cela doit être fait comme une étape distincte après l'initialisation ( sans utiliser le troisième paramètre de createFromFormat()) pour les raisons évoquées ci-dessus.
La setTimeZone()méthode peut être utilisée pour accomplir cette exigence.
Remarque: DateTime::createFromFormat('U.u', microtime(true));retournera false si microtime(true)s'exécute à la seconde exacte. Il renvoie «1438616239» au lieu de «1438616239.000000».
giggsey
1
Excellente solution, merci. Il semble que je perds mon temps local en créant $ maintenant à partir du microtime. Une idée?
daVe
1
@daVe J'ai ajouté quelques informations sur les fuseaux horaires, j'espère que c'est ce que vous recherchiez.
ArchCodeMonkey
1
Le number_formatest toujours nécessaire, même si ce n'est pas à la seconde exacte. Sinon, vous êtes à la merci de l' precisionoption de configuration PHP (pour "display"), qui n'est pas assez haute par défaut à partir de PHP 7.0 entraînant une perte de précision (pas précise jusqu'à la microseconde).
Teoh Han Hui
1
Faites toujours défiler vers le bas dans StackOverflow
tom10271
15
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 convertis la valeur de la microseconde en chaîne, je supprime le 0et l'ajoute à la fin de la chaîne de date / heure. Je peux facilement couper le nombre de décimales en ajustant le paramètre de longueur de chaîne; ici, j'utilise 4pour obtenir des millisecondes, mais vous pouvez utiliser 7pour obtenir des microsecondes.
Si vous avez besoin de limiter le nombre de décimales, la ligne ci-dessous (credit mgutt) serait une bonne alternative. (Avec le code ci-dessous, le 6 limite le nombre de décimales à 6.)
Vous avez manqué la précision et le zéro pendant quelques secondes. La version correcte devrait donc être echo date('m-d-Y H:i:').sprintf('%09.6f', date('s')+fmod(microtime(true), 1));. Explication pourquoi nous avons besoin 09: stackoverflow.com/a/28739819/318765
mgutt
Vous avez encore manqué la précision;)echo date('H:i:s').substr(fmod(microtime(true), 1), 1, 7);
mgutt
Mais attention, substr()ne ronds pas. Et en parallèle round(), couperait les zéros de fin: stackoverflow.com/questions/7493305/ ... C'est la raison pour laquelle j'ai proposé sprintf().
mgutt
@mgutt Quand le premier chiffre ne serait-il pas un zéro? Fondamentalement, il faut simplement supprimer le zéro qui est toujours présent lors de l'obtention du reste de fmod par 1. La question demande des microsecondes mais sous la forme de décimales des secondes. Il n'y a aucune raison de limiter le nombre de décimales. Plus de décimales est simplement une meilleure précision.
ghbarratt le
@mgutt J'ai ajouté votre première alternative suggérée à ma réponse, expliquant que ce serait un bon moyen de limiter le nombre de décimales si nécessaire
ghbarratt
3
Si vous souhaitez formater une date comme celle de JavaScript (new Date()).toISOString()pour une raison quelconque, voici comment vous pouvez le faire en PHP:
N'utilisez pas de maths sur le nombre à virgule flottante, c'est inexact. Ne perdez pas non plus de temps à appeler plusieurs fonctions. Utilisez simplement substr () pour tronquer la date formatée à trois décimales.
LS
@LS Truncating n'arrondira pas la 3e décimale, ce qui est probablement encore plus inexact. Les flotteurs ne se décomposent que lorsque vous entrez dans de très petites précisions; 3 décimales devraient convenir. En fait, je ne pense pas que je modifie du tout la précision, les flottants deviennent plus précis à mesure que vous vous rapprochez de 0. La soustraction du nombre entier ne devrait pas modifier les décimales AFAIK.
mpen
Et quoi date('Y-m-d\TH:i:s', $time / 1000) . sprintf('.%03dZ', substr($time, 10));?
F8ER
@ F8ER Si vous êtes $timedéjà en millisecondes, oui, cela fonctionnerait techniquement. Je n'aime pas le substrhack, mais je suppose que cela fonctionnerait pour des dates entre 2001 et 2286.
mpen
Oui, $timec'est MS, mais qu'en est-il 2286, je veux dire pourquoi pensez-vous ainsi et comment serait-il possible d'échapper à un tel?
F8ER
3
Ceci est basé sur la réponse d'ArchCodeMonkey.
Mais simplement simplifié, si vous voulez juste quelque chose de rapide qui fonctionne.
Microsecondes (ajouté dans 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.
Oui, selon la réponse ci-dessus (et mes essais) new DateTime()renverra également 0000 pour u. Mais si vous lui fournissez un temps de précision de l'ordre de la microseconde lors de son instanciation, cela fonctionne bien.
scipilot
@scipilot ok, alors comment fais-tu ça?
Geo
@Geo voir la réponse acceptée. new DateTime( 'Y-m-d H:i:s.'.$micro);
scipilot
0
Avec PHP 7.0+ maintenant, vous pouvez faire ce qui suit:
Coupe les 4 derniers zéros de la chaîne pour Date()pouvoir gérer la date.
Utilise la date pour mettre en forme les millisecondes dans une chaîne de date et d'heure que DateTime peut comprendre.
DateTime()peut alors vous permettre de modifier le fuseau horaire dans lequel vous vous trouvez, mais assurez-vous qu'il date_default_timezone_set("Timezone");est défini avant d'utiliser des DateTime()fonctions et des classes.
Il est recommandé d'utiliser un constructeur dans vos classes pour vous assurer que vous DateTime()êtes dans le bon fuseau horaire lorsque des classes ou des fonctions sont utilisées.
Réponses:
php.net dit:
Alors utilisez aussi simple que cela:
dateTime()
Classe d' utilisation et recommandée de référencée:La note
u
est en microsecondes (1 seconde = 1000000 µs).Un autre exemple de php.net :
Référence de
dateTime()
sur php.netJ'ai répondu à une question aussi courte et simplifiée à l'auteur. Veuillez consulter pour plus d'informations à l'auteur: obtention du format de date mdY H: i: su à partir de millisecondes
la source
microtime(false)
plus.)2012-07-08 11:14:15.0.889342
Vous pouvez facilement le faire avec le format d'entrée
U.u
.Cela produit la sortie suivante:
Depuis la page de manuel PHP pour les formats de date:
http://php.net/manual/en/function.date.php
Merci à Giggsey d'avoir signalé une faille dans ma réponse originale, l'ajout
number_format()
à la ligne devrait corriger le cas de la seconde exacte. Dommage qu'il ne soit plus aussi élégant ...http://php.net/manual/en/function.number-format.php
Une note sur les fuseaux horaires en réponse à DaVe.
Normalement, la
createFromFormat()
méthode utilisera le fuseau horaire local si aucun n'est spécifié.http://php.net/manual/en/datetime.createfromformat.php
Cependant, la technique décrite ici consiste à initialiser l'objet DateTime en utilisant
microtime()
qui renvoie le nombre de secondes écoulées depuis l'époque Unix (01 janvier 1970 00:00:00 GMT).http://php.net/manual/en/function.microtime.php
Cela signifie que l'objet DateTime est implicitement initialisé à UTC, ce qui convient parfaitement aux tâches internes du serveur qui souhaitent simplement suivre le temps écoulé.
Si vous avez besoin d'afficher l'heure pour un fuseau horaire particulier, vous devez le régler en conséquence. Cependant, cela doit être fait comme une étape distincte après l'initialisation ( sans utiliser le troisième paramètre de
createFromFormat()
) pour les raisons évoquées ci-dessus.La
setTimeZone()
méthode peut être utilisée pour accomplir cette exigence.http://php.net/manual/en/datetime.settimezone.php
Par exemple:
Produit la sortie suivante:
Notez que si vous souhaitez entrer dans mysql, le format de l'heure doit être:
la source
DateTime::createFromFormat('U.u', microtime(true));
retournera false simicrotime(true)
s'exécute à la seconde exacte. Il renvoie «1438616239» au lieu de «1438616239.000000».number_format
est toujours nécessaire, même si ce n'est pas à la seconde exacte. Sinon, vous êtes à la merci de l'precision
option de configuration PHP (pour "display"), qui n'est pas assez haute par défaut à partir de PHP 7.0 entraînant une perte de précision (pas précise jusqu'à la microseconde).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 convertis la valeur de la microseconde en chaîne, je supprime le
0
et l'ajoute à la fin de la chaîne de date / heure. Je peux facilement couper le nombre de décimales en ajustant le paramètre de longueur de chaîne; ici, j'utilise4
pour obtenir des millisecondes, mais vous pouvez utiliser7
pour obtenir des microsecondes.Pour une valeur microtime () de
0.98236000 1407400573
, ceci renvoie08-07-14 01:08:13.982
.la source
J'utilise
la source
exemple de sortie:
Si vous avez besoin de limiter le nombre de décimales, la ligne ci-dessous (credit mgutt) serait une bonne alternative. (Avec le code ci-dessous, le 6 limite le nombre de décimales à 6.)
exemple de sortie:
la source
echo date('m-d-Y H:i:').sprintf('%09.6f', date('s')+fmod(microtime(true), 1));
. Explication pourquoi nous avons besoin09
: stackoverflow.com/a/28739819/318765echo date('H:i:s').substr(fmod(microtime(true), 1), 1, 7);
substr()
ne ronds pas. Et en parallèleround()
, couperait les zéros de fin: stackoverflow.com/questions/7493305/ ... C'est la raison pour laquelle j'ai proposésprintf()
.Si vous souhaitez formater une date comme celle de JavaScript
(new Date()).toISOString()
pour une raison quelconque, voici comment vous pouvez le faire en PHP:Exemple de sortie:
Juste pour prouver que la soustraction du nombre entier ne réduit pas la précision de la partie décimale:
PHP a arrondi les décimales, mais il les a arrondis de la même manière dans les deux cas.
la source
date('Y-m-d\TH:i:s', $time / 1000) . sprintf('.%03dZ', substr($time, 10));
?$time
déjà en millisecondes, oui, cela fonctionnerait techniquement. Je n'aime pas lesubstr
hack, mais je suppose que cela fonctionnerait pour des dates entre 2001 et 2286.$time
c'est MS, mais qu'en est-il2286
, je veux dire pourquoi pensez-vous ainsi et comment serait-il possible d'échapper à un tel?Ceci est basé sur la réponse d'ArchCodeMonkey.
Mais simplement simplifié, si vous voulez juste quelque chose de rapide qui fonctionne.
Alors pour moi alors
la source
Voici une autre méthode que je trouve légèrement plus élégante / simple:
la source
Depuis PHP 7.1, vous pouvez simplement faire ceci:
Il s'affichera comme:
la source
la source
La documentation dit ce qui suit:
Ie, utilisez plutôt DateTime.
la source
new DateTime()
renverra également 0000 pour u. Mais si vous lui fournissez un temps de précision de l'ordre de la microseconde lors de son instanciation, cela fonctionne bien.new DateTime( 'Y-m-d H:i:s.'.$micro);
Avec PHP 7.0+ maintenant, vous pouvez faire ce qui suit:
Cela fait ce qui suit dans l'ordre:
Date()
pouvoir gérer la date.DateTime()
peut alors vous permettre de modifier le fuseau horaire dans lequel vous vous trouvez, mais assurez-vous qu'ildate_default_timezone_set("Timezone");
est défini avant d'utiliser desDateTime()
fonctions et des classes.DateTime()
êtes dans le bon fuseau horaire lorsque des classes ou des fonctions sont utilisées.la source
si vous utilisez Carbon, vous pouvez utiliser la spécification définie "RFC3339_EXTENDED". ou personnalisez-le.
la source
Basé sur la réponse @ArchCodeMonkey.
Si vous avez,
declare(strict_types=1)
vous devez convertir le deuxième argument en chaînela source
J'ai établi un banc de différentes manières:
1) microtime + sscanf + date:
Je ne sais pas pourquoi microtime () renvoie 10 caractères (0.dddddd00) pour la partie microsecondes mais peut-être que quelqu'un peut me le dire?
2) DateTime :: createFromFormat + Datetime-> format:
ne fonctionne pas en PHP 5.x ...
3) gettimeofday + date:
-
4) microtime + number_format + DateTime :: createFromFormat + DateTime-> format:
-
5) microtime + sprintf + DateTime :: createFromFormat + DateTime-> format:
-
la source