DateTime avec microsecondes
Dans mon code, je suis en utilisant DateTime
objets à manipuler des dates, puis de les convertir à d'horodatage afin de les enregistrer dans certains des fichiers JSON.
Pour certaines raisons, je veux avoir la même chose que DateTime (ou quelque chose de proche), mais avec quelques microsecondes de précision (que je voudrais convertir flotter lors de l'insertion à l'intérieur de la fichiers JSON).
Ma question est : est-il un PHP objet c'est comme DateTime
mais peut gérer microsecondes trop ?
L'objectif est d'être capable de manipuler microtimes avec les objets.
Dans le date() de la documentation, il y a quelque chose qui indique que DateTime peut être créé avec les microsecondes, mais je n'ai pas pu trouver comment.
u Microsecondes (ajouté en PHP 5.2.2). Notez que date() sera toujours
générer 000000 car elle prend un paramètre de type entier, tandis que
DateTime::format() prend en charge microsecondes si DateTime a été créé
avec microsecondes.
J'ai essayé de mettre le timestamp d'un objet DateTime avec une valeur flottante (microtime(true)
), mais ça ne fonctionne pas (je pense qu'il convertit le timestamp int, causant la perte de quelques microsecondes).
Voici comment j'ai essayé
$dt = new DateTime();
$dt->setTimestamp(3.4); //I replaced 3.4 by microtime(true), this is just to give an example
var_dump($dt);
var_dump($dt->format('u'));
La .4
n'est pas pris en compte comme vous pouvez le voir ici (même si on peut utiliser le u
format, ce qui correspond à la microseconde).
object(DateTime)[1]
public 'date' => string '1970-01-01 01:00:03' (length=19)
public 'timezone_type' => int 3
public 'timezone' => string 'Europe/Berlin' (length=13)
string '000000' (length=6)
EDIT : j'ai vu ce code, qui permet d'ajouter de microsecondes à un DateTime, mais j'aurais besoin d'appliquer beaucoup de modifications à la microtime avant la création de l'DateTime. Comme je vais l'utiliser beaucoup, je veux faire de petites modifications pour le microtime que possible avant d'obtenir le "microtime objet".
$d = new DateTime("15-07-2014 18:30:00.111111");
source d'informationauteur Heru-Luin | 2015-11-13
Vous devez vous connecter pour publier un commentaire.
Voici une méthode très simple de créer un objet DateTime qui comprend microtime.
Je n'ai pas plonger dans cette question trop profondément, donc si j'ai raté quelque chose, je m'excuse, mais j'espère que vous trouverez cela utile.
Je l'ai testé et essayé divers autres façons de faire ce travail qui semble logique, mais c'est la seule méthode qui a fonctionné.
Cependant il y a un problème, c'était de retourner le bon temps partie, mais pas la bonne partie jour (à cause de l'heure UTC le plus probable)
Voici ce que j'ai fait (semble encore plus simple à mon humble avis):
Voici un exemple de travail: http://sandbox.onlinephpfunctions.com/code/66f20107d4adf87c90b5c8c914393d4edef180a2
Mise à JOUR
Comme l'a souligné dans les commentaires, comme d'PHP 7.1, la méthode recommandée par Planplan semble être supérieure à celle indiquée ci-dessus.
Donc, encore une fois pour PHP 7.1 et plus tard, il peut être préférable d'utiliser le code ci-dessous à la place de la ci-dessus:
S'il vous plaît être conscient que le ci-dessus ne fonctionne que pour les versions de PHP 7.1 et au-dessus. Les versions précédentes de PHP return 0 à la place de la microtime, donc de perdre tous microtime de données.
Voici une mise à jour de sandbox en montrant à la fois:
http://sandbox.onlinephpfunctions.com/code/a88522835fdad4ae928d023a44b721e392a3295e
REMARQUE: dans le test ci-dessus sandbox je n'ai jamais voir le microtime(TRUE) l'échec qui Planplan mentionné qu'il a vécu. La mise à jour de la méthode, cependant, semblent enregistrer un degré de précision plus élevé, tel que suggéré par KristopherWindsor.
En regardant une réponse sur le PHP DateTime manuel:
Toutefois, en prenant une réponse de ici:
Recommandé et l'utilisation
dateTime()
classe de référence:De référence de
dateTime()
sur php.net: http://php.net/manual/en/datetime.construct.php#J'ai décidé d'étendre la classe
DateTime
en utilisant les conseils que vous tous m'a donné.Le constructeur prend un flotteur (à partir de
microtime
) ou rien (dans ce cas, il sera initialisé avec la "micro-timestamp").J'ai aussi surdéfini 2 fonctions qui sont importantes :
setTimestamp
etgetTimestamp
.Malheureusement, je ne pouvais pas résoudre les spectacles de problème, bien qu'il n'est pas aussi lent que je ne le pensais.
Voici l'ensemble de la classe :
Il y a plusieurs options. Mais comme cela est déjà prévu par Ben, je vais essayer de vous donner une autre solution.
Si vous avez fourni plus de détails sur ce genre de calculs que vous voulez faire, il pourrait être changé plus loin.
ou
ou
ou