PHP DateInterval est-il comparable à DateTime?
J'ai découvert qu'un objet DateTime en PHP peut être comparé à une autre est la ">" et "<" les opérateurs sont surchargés.
Est-il de même avec DateInterval?
Que j'essayais de répondre à cette question, j'ai trouvé quelque chose d'étrange:
<?php
$today = new DateTime();
$release = new DateTime('14-02-2012');
$building_time = new DateInterval('P15D');
var_dump($today->diff($release));
var_dump($building_time);
var_dump($today->diff($release)>$building_time);
var_dump($today->diff($release)<$building_time);
if($today->diff($release) < $building_time){
echo 'oK';
}else{
echo 'Just a test';
}
Il a toujours fait écho à un "test". Le var_dump sorties sont:
object(DateInterval)#4 (8) {
["y"]=>
int(0)
["m"]=>
int(0)
["d"]=>
int(18)
["h"]=>
int(16)
["i"]=>
int(49)
["s"]=>
int(19)
["invert"]=>
int(1)
["days"]=>
int(18)
}
object(DateInterval)#3 (8) {
["y"]=>
int(0)
["m"]=>
int(0)
["d"]=>
int(15)
["h"]=>
int(0)
["i"]=>
int(0)
["s"]=>
int(0)
["invert"]=>
int(0)
["days"]=>
bool(false)
}
bool(false)
bool(true)
Quand j'ai essayer avec un DateTime "01-03-2012" tout fonctionne.
source d'informationauteur artragis
Vous devez vous connecter pour publier un commentaire.
Semble qu'il y a un problème/demande de fonctionnalitéspas sûr que si que jamais réalisé dans le coffre. Ce n'est pas documentée (que je Peux trouver), soit, de manière probablement pas sûrs à utiliser.
Cela dit, après quelques tests, il semble qu'elles puissent être comparées, mais seulement après qu'ils ont été "évalué" en quelque sorte (var dump change le résultat). Voici mon test/résultat:
Résultat (j'ai omis le plein de vidages des objets interval):
En bref, la comparaison de
DateInterval
objets n'est pas actuellement pris en charge par défaut (comme de php 5.6).Comme vous le savez déjà, le
DateTime
Objets sont comparables.Un moyen pour atteindre le résultat souhaité, est de soustraire ou d'ajouter le
DateInterval
à partir d'unDateTime
objet et de comparer les deux pour déterminer la différence.Exemple: https://3v4l.org/XeSJe
Modifier
De la version de PHP 7.1 les résultats sont différents de PHP 5.x, en raison de la ajout du support pour la microsecondes.
Exemple: https://3v4l.org/rCigC
Résultats (7.1+):
Résultats (5.x - 7.0.x, 7.1.3):
Pour contourner ce problème, il est recommandé que vous utilisez
clone
de comparer lesDateTime
des objets à la place.Exemple: https://3v4l.org/CSpV8
Résultats (5.x - 7.x):
EDIT:
Voir @fyrye réponse à la justification (et upvote!). Ma réponse ne traite pas avec les années bissextiles en toute sécurité.
Réponse Originale À Cette Question
Alors que je upvoted à cette question, je downvoted la accepté de répondre. C'est parce qu'il n'a pas fonctionné pour moi sur un de mes scripts PHP installations et parce que fondamentalement elle est fondée sur quelque chose de cassé à l'interne.
Ce que j'ai fait, au contraire, est de migrer ladite patch qui ne l'a jamais fait dans le tronc. FWIW j'ai vérifié une version récente, PHP 5.6.5et le patch n'est toujours pas là. Le code a été négligeable au port. La seule chose, c'est un avertissement dans la façon dont il rend la comparaison
Voici un exemple. Remarque, si vous avez besoin de comparer un
DateInterval
qui a été renvoyée par certains à un autre appel, vous aurez àcreate
unComparableDateInterval
d'abord, si vous voulez l'utiliser comme la source de la comparaison.Voici le code
Non, ce n'est pas possible en ce moment et il ne le sera jamais. Il y a un problème fondamental avec la comparaison de deux
DateInterval
'.Un
DateInterval
est relatif, tandis qu'unDateTime
est absolue:P1D
signifie 1 jour, donc on pourrait penser que les moyens (24*60*60) 86.400 secondes. Mais en raison de la Saut De Seconde il n'est pas toujours le cas.Qui ressemble à une situation rare, n'oubliez pas de comparer des mois avec jours, c'est encore plus difficile:
Où
$aujourdhui
venir? Sûr que c'est le même que$today
linguistiquement, mais PHP ne sait pas que! La modification de votre code pour utiliser$today
imprime"oK"
!Si non défini,
$aujourdhui->diff($release)
permettra d'évaluer à0
si votre PHP interprète ne pas abandonner avec une erreur (la mienne).J'ai utilisé la solution de contournement suivante comparant DateIntervals: