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