[RESOLU] Transformer une durée au format ISO 8601

Eléphanteau du PHP | 38 Messages

06 mars 2017, 15:02

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.

Eléphanteau du PHP | 41 Messages

06 mars 2017, 16:09

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

Eléphanteau du PHP | 38 Messages

06 mars 2017, 17:10

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; }