Carnet Wiki

Format de temps relatif en français

Version 3 — 2 weeks ago JLuc

Voir
-  https://github.com/tc39/proposal-intl-relative-time
-  http://cldr.unicode.org/
-  https://developers.google.com/web/updates/2018/10/intl-relativetimeformat

La fonction que j’utilise actuellement

Elle renvoie “il y a 3 minutes” ou “il y a 40 minutes” ou “il y a 2h30” ou “ce matin” ou “ce midi” ou “hier” ou “avant hier” ou “26 mars” si on passe ’affdate_court’ en 2eme argument.

Si le 2eme argument vaut ’duree_cache’, alors c’est la durée de validité de la réponse obtenue qu’on veut savoir, avec une marge d’erreur convenable.
Et sinon, c’est un nom de la fonction à appeler pour les dates antérieures à avant-hier.

<code class=’php ’>//
>//
function age_ilya_progressif ($from_datetime, $f_vieux=null)
$veut_cache = ($f_vieux==’duree_cache’);

$from_time = strtotime($from_datetime);
$fromH = intval(date(’H’, $from_time)); // H : heure format 24h avec 0 devant si nec
$from_dayyear = intval(date(’z’, $from_time)); // d : jour de l’année 0 à 365

$to_time = strtotime($now=date(“Y-m-d H:i:s”));
$to_dayyear = intval (date (’z’));

$nuit = ($fromH < 5);
$matin = (($fromH>= 5) and ($fromH<12));
$midi = (($fromH>=12) and ($fromH<14));
$aprem = (($fromH>=14) and ($fromH<18));
$soir = ($fromH>=18);
$debug=“”;
// spip_log (“de $from_datetime à $now : fromH $fromH nuit $nuit matin $matin midi $midi aprem $aprem soir $soir”, “age_progressif”);

$meme_jour = ($from_dayyear==$to_dayyear);
$hier = ($from_dayyear+1 == $to_dayyear);
$avanthier = ($from_dayyear+2 == $to_dayyear);

$age_m = round(($to_time - $from_time) / 60, );

if ($age_m <=10)
if ($veut_cache)
return 60;
if ($age_m <= 2)
return “à l’instant”;
// moins de 10 minute : pas d’arrondi
return “il y a $age_m minutes”;

// moins d’une heure : on arondit à 5 minutes
$age_m = round ($age_m/5)*5;
$age_m_reste = $age_m % 60;
$age_m_reste_long = sprintf(“%02d”, $age_m % 60); // %02d ou %’.02d : avec spécificateur de caractère de remplissage
$age_h = round (($age_m-$age_m_reste)/60, );
// spip_log (“de $from_datetime à $now : m=$age_m r=$age_m_reste rl=$age_m_reste_long h=$age_h”, “age_progressif”);
if ($age_m < 60)
if ($veut_cache)
return 4*60;
return “il y a $age_m minutes”;

if ($age_h < 4)
if ($veut_cache)
return 30*60;
if ($age_m_reste)
return “il y a $age_hh$age_m_reste_long”;
return “il y a $age_hh”;

if ($meme_jour)
if ($veut_cache)
return 60*60;
if ($age_h < 6)
return “il y a $age_hh”;
elseif ($nuit)
return “la nuit dernière”;
elseif ($matin)
return “ce matin”;
elseif ($midi)
return “ce midi”;
elseif ($aprem)
return “cet après-midi”; // jamais activé pour l’instant car on est pas le mm jour alors
elseif ($soir)
return “ce soir”; // idem
spip_log (“ age_ilya_progressif debug_assert ( false , ”age_ilya_progressif ($from_datetime,$f_vieux) : MEMEJOUR et age $age_h h $age_m m mais ni cette nuit ni ce matin ni ce midi ni cet aprem ni ce soir“, ”assert_age_progressif ");
return “aujourd’hui”;

if ($hier)
if ($veut_cache)
return 6*60*60;
if ($nuit or $matin)
return “hier matin”;
elseif ($midi)
return “hier midi”;
elseif ($aprem)
return “hier après-midi”;
elseif ($soir)
return “hier soir”;
spip_log (“ age_ilya_progressif debug_assert ( false , ”age_ilya_progressif ($from_datetime,$f_vieux) : HIER et age $age_h h $age_m m mais ni cette nuit ni ce matin ni ce midi ni cet aprem ni ce soir“, ”assert_age_progressif ");
return “hier”;

if ($avanthier)
if ($veut_cache)
return 10*60*60;
return “avant-hier”;

if ($veut_cache)
return 24*60*60;
if ($f_vieux and function_exists($f_vieux))
return $f_vieux ($from_datetime);
return “il y a”.round ($age_h/24,0).“jours.”;