Carnet Wiki

Format de temps relatif en français

Version 3 — Janvier 2021 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 2e argument.

Si le 2e 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. » ;