Comment convertir datetime en ISO 8601 en PHP

103

Comment convertir mon heure 2010-12-30 23:21:46au format de date ISO 8601? (-_-;)

sensationnel
la source
1
@Gordon oui j'ai obtenu environ 4530 résultats et j'ai trouvé une réponse de @alex
wow
@wow veuillez expliquer pourquoi aucun des 4530 résultats n'a répondu à votre question.
Gordon
1
@Gordon J'apprends toujours à écrire de A à Z mais j'ai trouvé qu'ils m'apprennent à écrire de Z à A :)
wow
@wow Non. Ils vous apprennent à écrire l'alphabet ($ from, $ to). Presque tous vous indiquent d'utiliser date($format, strtotime($dateString))ou l' DateTimeéquivalent de l' objet. Ils ne diffèrent que par l'entrée de ces fonctions. Tout ce que vous avez à faire est d' aller sur les pages correspondantes du manuel PHP et de découvrir quelle est l'entrée.
Gordon
3
@Gordon Oui, vous avez raison. Je connaissais juste l'alphabet et maintenant l'orthographe du temps des abeilles. J'espère que je suis dans la bonne école.
wow

Réponses:

229

Orienté objet

C'est la méthode recommandée.

$datetime = new DateTime('2010-12-30 23:21:46');

echo $datetime->format(DateTime::ATOM); // Updated ISO8601

De procédure

Pour les anciennes versions de PHP, ou si vous êtes plus à l'aise avec le code procédural.

echo date(DATE_ISO8601, strtotime('2010-12-30 23:21:46'));
Alex
la source
3
Question, le résultat est de 2010-12-30T23:21:46+1100savoir comment le faire être 2010-12-30T23:21:46+11:00?
wow
2
@wow Essayez ceci preg_replace('/(?<=\d{2})(?=\d{2}$)/', ':', '2010-12-30T23:21:46+1100'). Il sort 2010-12-30T23:21:46+11:00.
alex
12
date('c', strtotime('2010-12-30 23:21:46'))nice @Gordon :)
wow
8
Je DATE_ISO8601noterais que l'utilisation produit une chaîne de date qui est légèrement différente de ISO8601 (le deux-points est manquant dans le TZ, ISO8601 s'attend à ce que les temps soient tous avec OU tous sans les deux-points, pas un mélange) - date('c')produit une date valide ISO 8601 stricte - Cela pourrait rendre difficile la traçabilité des bogues si le code attend un format de date / heure ISO 8601 strict. Réf: en.wikipedia.org/wiki/ISO_8601
ckm
38

Après PHP 5, vous pouvez utiliser ceci: echo date("c");forme une date-heure au format ISO 8601.

http://ideone.com/nD7piL

Note pour commentaires:

En ce qui concerne à ce , ces deux expressions sont valables pour le fuseau horaire, pour le format de base: ±[hh]:[mm], ±[hh][mm], or ±[hh].

Mais notez que + 0X: 00 est correct et + 0X00 est incorrect pour une utilisation prolongée. Il vaut donc mieux utiliser date("c"). Une discussion similaire ici .

trante
la source
1
Notez la légère différence avec DATE_ISO8601; +0X:00vs +0X00.
Ja͢ck
@ Ja͢ck est-ce que cela nécessite un vote négatif, alors? Une légère différence est généralement une mauvaise idée.
rybo111
@ rybo111 Je ne vois pas de raison de voter contre cette réponse; techniquement, les deux 'c'et DATE_ISO8601produisent des représentations temporelles ISO8601 valides.
Ja͢ck
J'ai ajouté une note pour répondre.
trante le
@ Ja͢ck DATE_ISO8601ne produit pas de représentation ISO8601 valide. DATE_ATOM fait cependant
Captain Obvious
4

Comment convertir ISO 8601 en unixtimestamp:

strtotime('2012-01-18T11:45:00+01:00');
// Output : 1326883500

Comment convertir un horodatage unix en ISO 8601 (serveur de fuseau horaire):

date_format(date_timestamp_set(new DateTime(), 1326883500), 'c');
// Output : 2012-01-18T11:45:00+01:00

Comment convertir unixtimestamp en ISO 8601 (GMT):

date_format(date_create('@'. 1326883500), 'c') . "\n";
// Output : 2012-01-18T10:45:00+00:00

Comment convertir un horodatage unix en ISO 8601 (fuseau horaire personnalisé):

date_format(date_timestamp_set(new DateTime(), 1326883500)->setTimezone(new DateTimeZone('America/New_York')), 'c');
// Output : 2012-01-18T05:45:00-05:00
John Slegers
la source
1

Si vous essayez de définir une valeur dans datetime-local

date("Y-m-d\TH:i",strtotime('2010-12-30 23:21:46'));

//output : 2010-12-30T23:21
Rúbia Alves
la source
Une solution similaire est mentionnée dans les commentaires donnés à la réponse acceptée
sushant047