Page 1 sur 1

Transformer une durée au format ISO 8601

Posté : 06 mars 2017, 15:02
par jonjojo007
Bonjour,

Je souhaiterai transformer une durée du format "30 min" ou "1h30" (compréhensible avec strtotime par exemple) au format ISO 8601.

Petite difficulté, je suis en php 5.2 donc je n'ai pas DateInterval :/

J'ai pas mal cherché sur le net et je n'arrive pas à trouver ce qu'il me faut.

Merci.

Re: Transformer une durée au format ISO 8601

Posté : 06 mars 2017, 16:09
par tesmet
Bonjour, la fonction date() a le format c pour ISO 8601 depuis PHP5.0
echo date('c', strtotime("30min")); // 2017-03-06T15:35:40+01:00

ou faire un format pour un affichage alternatif au besoin (format o depuis PHP5.1)
echo date('o-m-d\TH:i:s.Z\Z', strtotime("30 min")); // 2017-03-06T15:35:40.3600Z

si la référence à DateInterval est pour ajouter/soustraire un temps à une date, strtotime() sait le faire
echo date('c', strtotime("2017-01-17 15:00:00"."+30 min")); // 2017-01-17T15:30:00+01:00
echo date('c', strtotime("2017-01-17 15:00:00"."-30 min")); // 2017-01-17T14:30:00+01:00

mais chez moi strtotime() semble retourner false sur "1h30"
var_dump(strtotime("1h30")); // boolean false

Re: Transformer une durée au format ISO 8601

Posté : 06 mars 2017, 17:10
par jonjojo007
Effectivement, 1h30 ça va pas. Il faut marquer 1 hour 30 minutes.

J'ai fait une fonction pour gérer les cas comme ça pour strtotime

Code : Tout sélectionner

function formatTimeStr($s) { if(preg_match('#([0-9]{1,2})\s*min#',$s,$res)) { return $res[1].' minutes'; } elseif(preg_match('#([0-9]{1})\s*h(\s*[0-9]{1,2})?#',$s,$res)) { return $res[1].' hour'.(!empty($s[2])?' '.$s[2].' minutes':''); } elseif(preg_match('#([0-9]) (nuit|jour)#i',$s,$res)) { return intval($res[1]*12). ' hours'; } elseif(preg_match('#une nuit#i',$s) || preg_match('#un jour#i',$s,$res)) { return '12 hours'; } elseif(preg_match('#aucun#i',$s,$res)) { return '0 minute'; } else { return 0; } }
Et du coup j'ai réussis à faire fonctionner une fonction trouvée sur le net comme çà de cette mannière :

Code : Tout sélectionner

time_to_iso8601_duration(strtotime(formatTimeStr($duree),0))

Code : Tout sélectionner

function time_to_iso8601_duration($time) { $units = array( "Y" => 365*24*3600, "D" => 24*3600, "H" => 3600, "M" => 60, "S" => 1, ); $str = "P"; $istime = false; foreach ($units as $unitName => &$unit) { $quot = intval($time / $unit); $time -= $quot * $unit; $unit = $quot; if ($unit > 0) { if (!$istime && in_array($unitName, array("H", "M", "S"))) { // There may be a better way to do this $str .= "T"; $istime = true; } $str .= strval($unit) . $unitName; } } return $str; }