Mastodon

In Tcl con il comando clock accediamo alle funzioni dedicate alla gestione dell’ora e della data.

In particolare questo comando ha diversi sottocomandi molto utili:

  • seconds – per acquisire l’ora corrente;
  • format – per convertire l’ora e la data in formati differenti;
  • scan – esegue l’operazione inversa del sottocomando format;
  • add – per fare somme e sottrazioni con le ore e le date.

Come acquisire l’ora corrente

# sintassi
clock seconds

Il sottocomando seconds restituisce il valore dei secondi trascorsi da un determinato istante di riferimento. Questo riferimento può cambiare a seconda del sistema operativo e viene indicato con il termine epoca (epoch).

Per i sistemi Unix e Unix-like, come il sistema GNU/Linux, corrisponde alla mezzanotte del 1 gennaio 1970.

Per questo motivo seconds viene utilizzato principalmente per fare dei confronti all’interno di uno stesso programma e calcolare così il tempo trascorso tra un evento ed un altro.

Come formattare l’ora e la data

Per formattare l’ora e la data, in base alle nostre esigenze, Tcl ci mette a disposizione il sottocomando format.

# sintassi
clock format clockValue ?-gmt boolean? ?-format string? ?-timezone zone?

Il sottocomando format trasforma il valore clockValue (che è il valore restituito dal sottocomando seconds) in una stringa umanamente leggibile.

L’argomento -gmt è un valore booleano: se questo valore è 1 o true, allora il tempo sarà formattato come ora media di Greenwich (senza considerare l’ora legale), altrimenti sarà formattato tenendo conto dell’ora legale se questa è prevista nella specifica località dove si sta operando.

L’opzione -format specifica l’effettivo formato che dovrà avere la stringa.

Codice	Significato
-------------------------------------------------
%a	Nomi dei giorni abbreviati (Mon, Tue, etc.)
%A	Nomi dei giorni completi (Monday, Tuesday, etc.)
%b	Nomi dei mesi abbreviati (Jan, Feb, etc.)
%B	Nomi dei mesi completi (January, February, etc.)
%d	Giorno del mese
%j	Giorno dell'anno (calendario giuliano)
%m	Numero del mese (01-12)
%y	Anno in secoli
%Y	Anno in quattro cifre (2016)
%H	Ora (00-23)
%I	Ora (00-12)
%M	Minuti (00-59)
%S	Secondi (00-59)
%p	PM or AM
%D	Data come %m/%d/%y
%r	Ora come %I:%M:%S %p
%R	Ora come %I:%M
%T	Ora come %I:%M:%S
%Z	Nome del fuso orario

Come ottenere il valore dell’orologio del sistema

# sintassi
clock scan dateString ?-format format?

Con il sottocomando scan possiamo convertire la stringa dateString nel valore dei secondi dell’orologio del sistema.

Se non utilizziamo l’opzione facoltativa -format, la stringa dateString può assumere una delle seguenti forme:

  • Ora
    • hh:mm:ss ?meridian? ?zone?
    • hhmm ?meridian? ?zone?
    • L’opzione facoltativa ?meridian? può assumere uno di questo valori: AM o PM (oppure am o pm). Se l’opzione non viene specificata, l’ora viene interpretata sulla base 24h.
    • L’opzione facoltativa ?zone? indica il fuso orario e viene espressa con un massimo di tre caratteri (p.e. CET sta per Tempo dell’Europa Centrale).
  • Data
    • mm/dd/yy
    • mm/dd
    • monthname dd, yy
    • monthname dd
    • dd monthname yy
    • dd monthname
    • day, dd monthname yy

Come fare somme e sottrazioni con le ore e le date

# sintassi
clock add clockval ?number units?… ?-gmt boolean? ?-locale locale? ?-timezone zone?

Il parametro clockval (che è il valore restituito dal sottocomando seconds) viene sommato al valore positivo o negativo number che rappresenta la units specificata (p.e. day/days, month/months, year/years, second/seconds, minute/minutes e hour/hours).

# esempio

proc myFormat {mySeconds} {
    set result [clock format $mySeconds -format \
                "Date: %A %d %B %Y\nTime: %H:%M:%S"]   
    return $result
}

puts "Now\n[myFormat [clock seconds]]"

puts "\nAdd 2 days 3 months 1 year -1 hour 1 minute and 10 seconds"

puts "[myFormat [clock add [clock seconds]\
      2 days\
      3 months\
      1 year\
      -1 hour\
      1 minute\
      10 seconds]]"
---
Now
Date: Tuesday 22 September 2026
Time: 11:43:31

Add 2 days 3 months 1 year -1 hour 1 minute and 10 seconds
Date: Friday 24 December 2027
Time: 10:44:41

Nel prossimo articolo impareremo a lavorare con un database.