Accueil





Convertir un temps donné en millisecondes en temps lisible avec une précision dynamique



Pratique pour afficher le temps restant avant expiration d'un ban par exemple.

Si vous avez un temps exprimé en secondes, multipliez-le simplement par 1000.

Nous n'utilisons pas strftime car la méthode utilisée ci-dessous est plus rapide et a l'avantage d'afficher la durée avec une précision dynamique.

Vous aurez également besoin de la procédure plural, qui permet d'accorder un mot au singulier ou au pluriel selon la quantité.


Procédure
proc adapt_time_resolution {duration {short 0}} { set duration [::tcl::string::trimleft $duration 0] set milliseconds [::tcl::string::range $duration end-2 end] set duration [::tcl::string::range $duration 0 end-3] if { $duration eq "" } { set duration 0 } set days [expr {abs($duration / 86400)}] set hours [expr {abs(($duration % 86400) / 3600)}] set minutes [expr {abs(($duration % 3600) / 60)}] set seconds [expr {$duration % 60}] set valid_units 0 set counter 1 set output {} foreach unit [list $days $hours $minutes $seconds] { if { ($unit > 0) || (($counter == 4) && ($milliseconds != 0)) } then { switch -- $counter { 1 { if { !$short } { lappend output "$unit [plural $unit "jour" "jours"]" } else { lappend output "${unit}j" } } 2 { if { !$short } { lappend output "$unit [plural $unit "heure" "heures"]" } else { lappend output "${unit}h" } } 3 { if { !$short } { lappend output "$unit [plural $unit "minute" "minutes"]" } else { lappend output "${unit}mn" } } 4 { if { [::tcl::string::trimright $milliseconds 0] == "" } { set show_ms 0 } else { set show_ms 1 } set milliseconds "[string repeat 0 [expr {3-[::tcl::string::length $milliseconds]}]]$milliseconds" if { $show_ms } { if { !$short } { lappend output "${unit}.$milliseconds [plural "${unit}$milliseconds" "seconde" "secondes"]" } else { lappend output "${unit}.${milliseconds}s" } } else { if { !$short } { lappend output "$unit [plural $unit "seconde" "secondes"]" } else { lappend output "${unit}s" } } } } incr valid_units } incr counter } if { !$short } { if { $valid_units > 1 } { # Texte "et" set output [linsert $output end-1 "et"] } return [join $output] } else { return [join $output ""] } }


Exemples
adapt_time_resolution 5454545000 Tcl: 63 jours 3 heures 9 minutes et 5 secondes
adapt_time_resolution 5454545421 Tcl: 63 jours 3 heures 9 minutes et 5.421 secondes
adapt_time_resolution 86405000 Tcl: 1 jour et 5 secondes
adapt_time_resolution 3627000 Tcl: 1 heure et 27 secondes
adapt_time_resolution 3827000 Tcl: 1 heure 3 minutes et 47 secondes
adapt_time_resolution 3660000 Tcl: 1 heure 1 minute
adapt_time_resolution 3660 Tcl: 3.660 secondes
adapt_time_resolution 1 Tcl: 0.001 seconde
adapt_time_resolution 1000 Tcl: 1 seconde
adapt_time_resolution 64651321 1 Tcl: 17h57mn31.321s

©2005-2016 Menz Agitat