Tutte le date con un assembly .NET

di Marco Fregoso, in ASP.NET,
  • 0
  • 0
  • 0
  • 7,28 KB

La gestione delle DLL in ambiente ASP.NET è così semplice da indurre gli sviluppatori a infilarle un po' dappertutto e in ogni occasione. Noi cercheremo di non abusarne e di analizzare la complessità delle funzioni, il loro utilizzo frequente e il numero delle applicazioni coinvolte per trovare la giustificazione a un tale uso.

E credo proprio che la gestione delle date sia uno di quei casi in cui una DLL che ci tolga qualche preoccupazione faccia proprio comodo.

Considerazioni storiche

Ma prima facciamo qualche considerazione sulle date. Il calendario che utilizziamo è stato introdotto nell'ottobre 1582 con la riforma gregoriana ed ha sostituito il precedente calendario giuliano. La riforma era stata dettata dalla necessità di "rallentare" il calendario che prevedeva "troppi anni bisestili" (uno su quattro: gli anni divisibili per 4 erano tutti bisestili). Era stato notato infatti che il calendario astronomico non corrispondeva più a quello "legale" e perciò si decise di abolire 10 giorni, dal 5 ottobre al 14 ottobre compresi: si passò quindi da giovedì 4 ottobre 1582 a venerdì 15 ottobre 1582. Contemporaneamente si decise che in futuro gli anni secolari, quelli divisibili per 100, sarebbero stati bisestili solo se divisibili anche per 400. E così furono bisestili il 1600 e il 2000, ma non il 1700, il 1800 e il 1900.

Queste considerazioni sono giustificate dal campo di azione della nostra DLL : dal 01/01/0001 al 31/12/9999 (l'anno zero non esiste: si è passati dall'anno 1 AC all'anno 1 DC ).

Vediamo ora la logica utilizzata nelle funzioni della DLL : ogni data in questi 9999 anni ha un corrispondente progressivo numerico a partire da 1 (01/01/0001) fino a 3.652.061 (13/12/9999): il 4 ottobre 1582 ha come progressivo 577.737 e, naturalmente, il 15 ottobre 1582 ha come progressivo 577.738.

Questo progressivo, chiamato progressivo dell'era cristiana, può essere utilizzato per verificare la sequenza di date, per calcolare quanti giorni intercorrono tra due date, per incrementare o decrementare una data di un determinato numero di giorni.

Il nostro algoritmo

E' intuibile che le funzioni più importanti siano quella che restituisce il progressivo di una data e quella che esegue l'operazione inversa, e cioè restituisce la data corrispondente ad un progressivo.

Ma questo non ci basta. Di ogni data vogliamo anche sapere:

  • il progressivo all'interno dell'anno
  • se l'anno è bisestile
  • il giorno della settimana.

Le funzioni sono dunque cinque e si trovano all'interno della classe Fregoso.ctDate , allegata all'articolo:

  • int i = progressivo (string s)
  • int i = progressivoanno (string s)
  • int i = bisestile (string s)
  • int i = settimana (string s)
  • string s = data (int i)

Le prime quattro richiedono un parametro di tipo stringa che corrisponde ad una data che deve essere nel formato GGMMAAAA (senza caratteri di separazione e con eventuali zeri a sinistra) e restituiscono un valore integer che è uguale a -1 se la data non è corretta: quindi per controllare la validità di una data può essere utilizzata una qualsiasi tra queste quattro funzioni. Se la data è invece corretta, le quattro funzioni restituiscono rispettivamente:

  • il progressivo dell'era cristiana: un valore compreso tra 1 e 3.652.061
  • il progressivo all'interno dell'anno: un valore compreso tra 1 e:
    • 365 se l'anno non è bisestile
    • 366 se l'anno è bisestile
    • 355 se l'anno è il 1582
  • un codice relativo all'anno bisestile:
    • 0 se l'anno non è bisestile
    • 1 se l'anno è bisestile
  • un codice relativo al giorno della settimana:
    • 0 se è domenica
    • 1 se è lunedì
    • ... 6 se è sabato

L'ultima funzione richiede un parametro di tipo integer che corrisponde ad un progressivo era cristiana e restituisce un valore string che è la data corrispondente nel formato GGMMAAAA . Se il progressivo indicato non è compreso tra i valori ammessi, viene restituita una stringa nulla ("").

Utilizzare l'assembly

Vediamo infine come scrivere un semplice modulo ASP.NET che utilizzi queste funzioni.

Preleviamo il file Fregoso.dll e copiamolo nella cartella / BIN/ che, come tutti sanno, deve essere una sottocartella della cartella in cui risiede il codice ASP.NET .

Nel nostro codice, dobbiamo prima importare l'assembly Fregoso.dll :

<%@ import namespace="Fregoso" %>

Creiamo un oggetto di tipo ctDate così:

ctDate miedate = new ctDate();

e definiamo e impostiamo i campi che ci servono:

string data1="29021996";
string data2="";
int prgera, prganno, bis, sett;
int prog2=728720;

utilizziamo le funzioni:

prgera=miedate.progressivo(data1);
prganno=miedate.progressivoanno(data1);
bis=miedate.bisestile(data1);
sett=miedate.settimana(data1);
data2=miedate.data(prog2);

Nell'esempio è stato utilizzato il linguaggio C# , ma va benissimo anche il VB.NET e l'unica variazione di rilievo si riferisce alla creazione dell'oggetto di tipo ctDate che in VB è:

Dim miedate as new ctDate()

Un'ultima considerazione: le date sono tutte nel formato italiano, per cui se il vostro server gestisce le date nel formato MMGGAAAA , è evidente che prima si deve operare una conversione.

A questo punto non mi resta che augurare buon divertimento a tutti.

Attenzione: Questo articolo contiene un allegato.

Contenuti dell'articolo

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti