Analyser et créer des ISO 8601 intervalles de Date et heure, comme PT15M en PHP
D'une bibliothèque et d'un webservice, je suis en utilisant communique temps-intervalles dans Format ISO 8601: PnYnMnDTnHnMnS
. Je veux convertir ces formats en quelques secondes à peine. Et vice-versa. Les secondes sont beaucoup plus facile à calculer avec.
Exemple les valeurs de l'intervalle sont:
- PT1M ou PT60S (1 minute)
- PT1H, PT60M ou PT3600S (1 heure)
J'ai besoin de deux fonctions: analyser de telles valeurs de secondes: iso8601_interval_to_seconds()
et de secondes dans de tels intervalles: iso8601_interval_from_seconds()
.
Ce dernier est plutôt simple, car il pourrait être fait dans le `"PT{$secondes}S", il suffit de passer quelques secondes le long, en tout temps. Peut-être que cela peut être fait plus agréable avec un analyseur qui bascule à H(heure) et M(minute)?
La première est plus difficile, mais peut-être qu'il y a un truc avec l'une des nombreuses cordes à jour des convertisseurs en PHP? J'aimerais apprendre comment utiliser cette fonction pour l'analyse d'intervalles. Ou apprendre une alternative.
- Une très tard prudence ... la conversion P1MT de secondes serait impossible, sauf si vous savez que vous soyez à la conversion d'un mois de 28, 29, 30 ou 31 jours. Pour cette question, vous ne pouvez pas convertir P1YT en 365 jours, sans se tromper d'une année sur quatre. (Il ya une raison pourquoi les intervalles ne sont pas spécifiées dans les jours ou les secondes dans la norme).
- La Réponse par Lee va dans les détails avec cette. TL;DR: vous avez besoin d'une date de départ.
- Ahh merci @berkes, j'en ai oublié que lors de l'écrémage de la page (je l'ai trouvé en cherchant quelque chose sans rapport).
Vous devez vous connecter pour publier un commentaire.
Il ressemble à PHP 5.3 est DateInterval prend en charge cette.
Si vous ne pouvez pas utiliser 5.3, je suppose que toute fonction de conversion serait de savoir combien de secondes sont dans un an, un mois, un jour, une heure et une minute. Puis, lors de la conversion de quelques secondes, il permettrait de séparer, dans l'ordre, prenant à chaque fois le modulo de l'opération précédente, jusqu'à ce qu' <60 secondes sont à gauche. Lors de la conversion à partir d'un ISO 8601 intervalle de représentation, il doit être facile à analyser la chaîne et multiplier chaque élément trouvé en conséquence.
DateInterval()
a un bug qui ne permet pas de fractions dans la norme ISO 8601 représentations il analyse: bugs.php.net/bug.php?id=53831Merci Lee, je n'étais pas au courant strtotime accepté ce format. C'était la pièce manquante de mon puzzle. Peut-être que mes fonctions peuvent compléter votre réponse.
La fonction prend également en charge négatif formats.
-P10Y9MT7M5S retournera un tableau comme:
[année] => -10 [mois] => -9 [jour] => 0 [heure] => 0 [minute] => -7 [deuxième] => -5 Si ce comportement n'est pas souhaité passer à false comme deuxième paramètre. De cette façon, la fonction retournera toujours des valeurs positives. Min/symbole plus sera toujours disponible dans le résultat de la clé ['symbole'].
Et un peu de mise à jour:
Cette fonction utilise la première fonction permettant d'obtenir le montant total de secondes.
|
personnages? Ils ne sont pas suivis par une branche alternative, mais ils ne sont pas précédés par un point d'interrogation?|
à se joindre à des références arrières ensemble soit. php.net/manual/de/regexp.reference.subpatterns.php Un vide alternative n'est pas nécessaire, parce que la?
quantificateur est utilisé.Être conscient que la conversion de la durée qui contiennent des Jours, des Mois et/ou Années en durée comme des secondes ne peut pas être fait avec précision, sans savoir qu'un départ de date/heure.
Par Exemple
C'est parce que septembre est de 30 jours, et en octobre a 31 jours. Le même problème se produit avec la conversion des Ans, en raison de saut-années bissextiles secondes. Leap-années d'introduire encore plus de complexité au Mois de conversion ainsi - depuis le mois de février est un jour de plus dans le saut-d'années qu'il en est autrement. Jours sont problématiques dans les régions où l'heure d'été est pratiquée une période d'un jour se produisant lors de la transition d'heure d'été, est en fait 1 heure de plus qu'il n'en serait autrement.
Tout cela étant dit, vous pouvez, bien sûr, de compresser les valeurs contenant seulement Heures, les Minutes et les Secondes dans les valeurs contenant quelques Secondes. Je suggère que vous construisez un simple analyseur de faire le travail (ou peut-être envisager une expression régulière).
Juste être conscient des pièges décrits ci-dessus, il peut y avoir des dragons. Si vous avez l'intention de traiter avec les Jours, les Mois et/ou Années, vous devez utiliser l'un des mécanismes intégrés de faire le calcul pour vous, dans le contexte d'une date/heure. Comme d'autres l'ont mentionné: la DateInterval classe, en combinaison avec les fonctions fournies par la classe DateTime est probablement la façon la plus intuitive pour le gérer. Mais qui est seulement disponible dans la version de PHP 5.3.0 ou plus.
Si vous avez à travailler avec moins de v5.3.0, vous pouvez essayer de construire quelque chose autour de ce petit bijou:
strtotime
ne fonctionnera pas avec le format ISO 8601 directement (par exemple.P1Y1DT1S
), mais le format qu'il ne comprendre (1Year1Day1Second
) n'est pas trop loin off -- il serait assez simple de conversion. (un peu "hacky"... mais c'est PHP pour vous).bonne chance!
Tests:
Ce que vous cherchez est de type DateTime::diff
L'objet DateInterval, représentant la différence entre deux dates ou FALSE en cas d'échec, comme illustré ci-dessous:
Juste utiliser des secondes au lieu de dates.
C'est à partir de http://www.php.net/manual/en/datetime.diff.php
Pour une référence à DateInterval voir http://www.php.net/manual/en/class.dateinterval.php