2017-06-05 1 views
1

J'ai besoin de calculer la différence de temps entre deux périodes d'une journée dans une horloge au format 24:00 heures en utilisant Tcl. Disons que mon heure de début est 06:30:00 le matin et l'heure de fin est 18:30:00 dans la soirée.Comment calculer l'intervalle de temps dans Tcl en utilisant les commandes d'horloge

J'ai essayé ce qui suit en utilisant Active Tcl 8.5 et 8.6 dans Windows.

set morn [clock scan 06:30:00 -format %H:%M:%S] 
set even [clock scan 18:30:00 -format %H:%M:%S] 
set diff [clock format [expr $even - $morn ] -format %H:%M:%S] 

La réponse est censée être 12:00:00 qui est la différence réelle mais, je reçois la réponse que 17:30:00 ce qui est tout à fait déroutant.

Je suppose que la différence de temps GMT de 05:30:00 est ajoutée à la différence que je suis dans un fuseau horaire GMT + 5:30 (IST).

Comment obtenir la différence exacte?

Répondre

1

La commande clock n'a rien en elle pour convertir le temps intervalles en forme lisible par l'homme, car il se concentre sur le temps de manipulation instants.

Vous avez raison de dire que le fuseau horaire dans lequel vous vous trouvez a provoqué un intervalle de temps étrange. Passer l'option -gmt 1 aurait aidé un peu, mais seulement jusqu'à ce que vous ayez un intervalle de 24 heures ou plus. À ce moment-là, il aurait fait une boucle et semblait très étrange.

La façon de traiter cela est de faire le formatage directement. Ce n'est pas très dur.

proc formatTimeInterval {intervalSeconds} { 
    # *Assume* that the interval is positive 
    set s [expr {$intervalSeconds % 60}] 
    set i [expr {$intervalSeconds/60}] 
    set m [expr {$i % 60}] 
    set i [expr {$i/60}] 
    set h [expr {$i % 24}] 
    set d [expr {$i/24}] 
    return [format "%+d:%02d:%02d:%02d" $d $h $m $s] 
} 
puts [formatTimeInterval [expr {$even - $morn}]] 
#==> +0:12:00:00 
+0

Merci beaucoup ... cela m'a beaucoup aidé :-) – chaitanyak

+0

Je dois mentionner que ce sont * jours * idéal, pas les vrais, et donc ne prennent pas en compte la complexité de tels changements DST, etc. Intervalle la manipulation (comme tout ce qui a à voir avec le temps) est plus difficile qu'il n'y paraît à première vue. –

0

Je ne comprends pas pourquoi ne pas utiliser l'option -timezone? Je suis dans TZ = CET donc pour moi la réponse est 13:00:00

Si j'ajoute l'option « -timezone UTC » Je reçois la bonne réponse:

set morn [clock scan 06:30:00 -format %T] 
puts "morn = $morn" 

set even [clock scan 18:30:00 -format %T] 
puts "even = $even" 

set diff [clock format [expr $even - $morn ] -format "%Y:%m:%d %T"] 
puts "diff = $diff" 

puts "difference = [expr $even - $morn]" 

puts "with -timezone UTC = [clock format [expr $even - $morn ] -timezone UTC -format %T]" 

L'affichage est

morn = 1496723400 
even = 1496766600 
diff = 1970:01:01 13:00:00 
difference = 43200 
with -timezone UTC = 12:00:00 
+0

Salut .. Merci pour la suggestion. Apparemment, "-timezone UTC" a fonctionné comme "-gmt 1" comme cité par Donal. – chaitanyak

+0

"GMT +1" ou "UTC +2 pour moi comme mon TZ est CEST. Et pour vous? –

+0

J'ai mis en place ma machine UNIX (désolé, je n'ai pas l'occasion de mettre en place sur une machine Windows) et voir le résultat: $ sudo systemsetup -gettimezone Fuseau horaire : Asie/Calcutta Result des mêmes commandes que ci-dessus. = 1496710800 morn même = 1496754000 diff = 1970: 01: 01 17:30:00 différence = 43200 avec -timezone UTC = 12:00:00 –