2016-06-08 1 views
0

Je souhaite représenter un intervalle de temps en tant que début/fin, mais aussi en tirant parti des abréviations que l'ISO 8601 semble autoriser: pour les champs de fin d'intervalle qui sont les mêmes que dans le point de départ. Par exemple, l'intervalle commençant maintenant et durant une semaine serait 2016-06-08T12: 27Z/15T12: 27 (notez l'omission d'un second "2016-06-").Comment formater un intervalle de temps de manière concise comme ISO 8601 début/fin en PHP?

Pour conjurer un problème potentiel XY, essayez de deviner: I ne voulez pas voulez que cet intervalle soit représenté comme 2016-06-08T12: 27Z/P1W, même s'il est plus court. I do veut que l'heure de fin soit représentée directement, mais abrégée dans la mesure du possible.

Je ne pense pas que DatePeriod fasse ce que je veux, n'est-ce pas? Il semble soit faire la moitié du travail (début et fin indépendamment, sans possibilité d'abréviation) ou le mauvais travail (renvoyant une durée, pas une heure de fin).

+0

PHP nous a laissés vous avez le contrôle total sur le formatage de la date. Il suffit de spécifier le format désiré lors de la sortie de la date. Il n'y a pas de spécial qui doit être fait. –

+0

@JohnConde Je ne peux pas spécifier de format statique car je ne sais pas a priori quels champs seront identiques et prêts à être omis. IOW Je ne peux pas savoir statiquement ce que mon "format désiré" (en termes de fonctions de type strftime) est. –

Répondre

3

Je ne comprends pas votre problème. Mais qu'en est-court enregistrement de la période:

Marque chaîne 2016-06-08T12:27Z/2016-06-15T12:27

et par regex simple, le réduire:

^(.+)\b(.+)\/\1(.+) to \1\2/\3 => 2016-06-08T12:27Z/15T12:27 

demo

MISE À JOUR

résultat commun après avoir testé

^(.*)(?:\b|T)(.*Z)\/\1(.+)Z$ 

demo

+0

C'est hackish, mais le genre de hackish que j'ai tendance à aimer ("less is more" philosophie). Laissez-moi introspecter un peu pour déterminer le prix de mon âme avant d'accepter cela. Je n'ai jamais pensé à le regexing! Une pensée: 2016-06-08T12: 27Z/2016-07-15T12: 27Z échoue. Probablement pas difficile à corriger, avec un \ b judicieux ajouté quelque part. –

+0

Échoue? Êtes-vous sur la queue Z? Il suffit d'ajouter Z à la fin du motif. – splash58

+0

Vos changements d'expressions régulières remplacent 2016-06-08T12: 27Z/2016-07-15T12: 27Z au 2016-06-08T12: 27Z/7-15T12: 27Z. Il devrait être 2016-06-08T12: 27Z/07-15T12: 27Z (mois sans rembourrage). Octobre-décembre aurait tort sur le fond, pas seulement sur la lettre. Mais pas de biggie; (. +) \ b (. +) \/\ 1 (. +) semble faire l'affaire. –