Seed7

Tempo e data          

Seed7 prevede una gestione nativa di date e tempo. Esiste in fatto il tipo time che si occupa di questa problematica ed èuno strumento estremamente efficente in questo ambito. La libreria che gestisce il tutto è time.s7i. Come al solito iniziamo da un piccolo esempio:

  Esempio 8.1
1
2
3
4
5
6
7
8
$ include "seed7_05.s7i";
include "time.s7i";

const proc: main is func

begin
write(time(NOW));
end func;

Abbiamo scritto un semplice programma che ci presenta a video l'ora attuale:

2013-10-20 14:22:45.292963 UTC+2 (DST)

così è come è apparsa sul mio computer. Se così trovate l'output un po' sovrabbondante potete riscrivere la riga 7 come segue:

write(strDate(time(NOW)));

strdate è un metodo che converte un tipo tempo in una stringa avente formato aaaa.mm.gg
Come abbiamo già detto e come è scritto nella documentazione ufficiale, time è un tipo (nativo, ricordiamocelo) che descrive tempo e data e dispone di numerose funzioni a corredo e di parecchie proprietà interessanti che facilitano molto la gestione delle date e in generale gli algoritmi che prevedono le stesse. Nell'esempio che segue ne vediamo in azione alcune, quindi non tutte, a titolo dimostrativo:

  Esempio 8.2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ include "seed7_05.s7i";
include "time.s7i";

const proc: main is func

begin
writeln(time(NOW));
writeln(isLeapYear(1963));
writeln(daysInYear(1999));
writeln(daysInMonth(2001,12));
writeln(str(time(NOW)));
writeln(dayOfWeek(time(NOW)));
writeln(dayOfYear(time(NOW)));
writeln(weekOfYear(2013, 293));
end func;

La riga 7 è quella già vista che stampa la data a video
La riga 8 individua se l'anno proposto è bisestile
La riga 9 ci restituisce i giorni che ci sono in un dato anno
La riga 10 invece ci mostra i giorni che ci sono nel 12esimo mese del 2001
La riga 11 mette la data in una stringa, utile per eventuali elaborazioni successive
La riga 12 ci dice numericamente in quale giorni della settimana siamo (lunedì = 1 domenica = 7)
La riga 13 espone il giorno come progressivo annuo
La riga 14 restituisce la settimana in cui ci troviamo il 293esimo giorno del 2013

L'output è il seguente:

2013-10-20 21:02:15.215964 UTC+2 (DST)
FALSE
365
31
2013-10-20 21:02:15.221965 UTC+2 (DST)
7
293
42

Se preferite è possibile una manipolazione anche diversa:

  Esempio 8.3
1
2
3
4
5
6
7
8
9
10
11
12
$ include "seed7_05.s7i";
include "time.s7i";

const proc: main is func
local
var time: now is time.value;
begin
now := time(NOW);
writeln(now.day);
writeln(now.month);
writeln(now.year);
end func;

In modo da ricavare i valori numerici progressivi di giorno, mese ed anno.
A volte può essere necessario effettuare il parsing di una stringa per ricavare una tipo time. Per questa finalità abbiamo la funzione parse:

Naturalmente anzichè NOW potete scegliere una data diversa anche se la cosa è un pochino, come dire, verbosa, dal momento che sarete comunque obbligati a specificare oltre a giorno, mese ed anno anche ore, minuti e secondi. Ad esempio:

write(time(2011,11,11,23, 10, 10));

  Esempio 8.4
1
2
3
4
5
6
7
8
9
10
11
12
$ include "seed7_05.s7i";
include "time.s7i";

const proc: main is func
local
var time: tempo is time.value;
var string: s1 is "";
begin
write("scrivi la data: ");
readln(s1);
tempo := time parse(s1);
end func;

E'banale dirlo ma va ricordato che l'input deve essere coerente; di suo parse riferito, al tipo time, accetta numerosi formati, per esplicitare i quali riprendo pari pari quanto presente sul sito di Seed7:

The accepted ISO 8601 date formats are YYYY-MM, YYYY-MM-DD, YYYY-MM-DDTHH, YYYY-MM-DDTHH:MM, YYYY-MM-DDTHH:MM:SS Additionally a space is also allowed to seperate the date and the time representations: YYYY-MM-DD HH, YYYY-MM-DD HH:MM, YYYY-MM-DD HH:MM:SS

Ci sono naturalmente questioni legate al tipo di cultura in essere sul vostro PC ma questo, che vale per gli anglosassoni (ho il vezzo di utilizzare sempre sistemi operativi in inglese) può essere facilmente "tradotto" verso qualunque altro tipo di cultura.
In caso di input non conforme sarete avvisati da una eccezione di RANGE_ERROR.

Una funzione utile in alcuni casi è il famoso Unix (o PosiX) Time, per il calcolo del quale Seed7 mette a disposizione il metodo timeStamp1970;

write(timestamp1970(time(NOW)));

ed il suo inverso (da intero a data a partite dal 1 genaio 1970) timeStamp1970ToTime;

write(timestamp1970ToTime(100000));

Nel prossimo capitolo vedremo un'altro tipo, nativo, molto interessante e strettamente legato a tempo e date: il tipo duration.