Redazione
a- a+

Formattare le date in ASP

Vediamo come gestire le date e vari tipi di formattazione. Esempi e codici.

Le date in ASP
Uno strumento molto utile per le nostre applicazioni è la gestione delle date (e anche degli orari). ASP e VBScript ci permettono una totale manipolazione di queste potendole sfruttare per diversi fini.

Quando è necessario utilizzare una data
Lo sviluppo di un qualsiasi programma mi porta a dover fare sempre uso delle date. Questa stessa piattaforma di e-learning fa un uso massiccio delle date: per impostare la pubblicazione della lezione, l'incontro in chat o quando c'è il questionario. Ma non solo. Mi permette di dare tutta una serie di permessi per poter visualizzare o meno una lezione, questionario... di poter ordinare dal piu' recente al meno i messaggi del forum... inoltre vengono tracciate tutte le principali operazioni che fa un utente (download, accesso, primo accesso, lezione letta, svolgimento questionario,...) tutto ha una data... in modo da poter stilare un profilo dettagliato sull'andamento e l'interesse di tutti voi in modo da poter agire in modo differente in base al "rapporto" che ha ciascun studente con il corso.

Quindi l'utilizzo di una data è molto utile per tracciare l'azioni degli utenti (entro i limiti :-), ma anche semplicemente per datare l'inserimento di un record nuovo, infatti ogni volta che inserisco una lezione nuova io imposto: data pubblicazione, data chat e data questionario, ma automaticamente il sistema inserisce anche la data d'inserimento (ovvero quella durante l'inserimento). Lo stesso discorso vale per l'ora.

I primi problemi
Pur mettendo a disposizione molti strumenti questi hanno dei limiti se non vengono sfruttati con intelligenza. Infatti molti di voi avranno notato che all'incirca tutti i database gestiscono in modo differente le date (quindi è impossibile realizzare un'applicazione standard) e inserendo una data in formato gg/mm/aaaa andandola a prelevare potremmo involontariamente visualizzarla mm/dd/aaaa perchè il database, senza ricevere nessuna richiesta da parte nostra, l'ha modificata in base alle sue "idee". Utilizzando Access, per esempio, questo può accadere... ci potrebbe venire in mente, allora, di utilizzare nella nostra applicazione la data in formato mm/gg/aaaa compatibile con Access, ma allora vedremmo che Access improvvisamente le trasforma in gg/mm/aaaa.

Con tutta questa confusione è impossibile gestire in modo corretto un programma.

La soluzione
La risposta al problema esiste è semplice e allo stesso tempo molto potente, ma soprattutto ci fa risparmiare ore nel riuscire a realizzare un software senza problemi nella gestione delle date.

Invece di gestire le date in gg/mm/aaaa o mm/gg/aaaa o in qualsiasi altro formato data, basterà gestire le date in formato

aaaammgg

Ovvero non piu' come data ma come un semplice numero intero. Per esempio il giorno 13/06/2003 (13 Giugno 2003) lo gestiremo come il numero

20030623

E' importante mantenere l'ordine aaaammgg perchè in questo modo riusciamo a fare direttamente i confronti tra date.

13 Giugno 2003 < 12 Luglio 2003

20030613 < 20030712

Non gestite mai le date in aammgg, ovvero prendendo le ultime 2 cifre dell'anno 2003 --> 03, questo sistema può causare problemi nel fare i confronti tra anni prima del 2000 e quelli dopo. Il 19 Settembre 1999 è minore di 24 Aprile 2004, ma 990919 non è minore di 040424.

Da data a numero
Per trasformare una data in formato numerico utilizziamo una funzione. In Italia si utilizza il formato gg/mm/aaaa pertanto adopereremo questo.

Vogliamo trasformare in numero il 13/06/2003 dovremmo prendere separatamente

13
06
2003

e unirli così: 20030613

Vediamo il codice per ottenere questo:

Codice 3.1

<%@ Language=VBScript %>
<% 
' Funzione DataInNum a cui passo una data
function DataInNum(data)
   ' Preleva dalla data l'anno
   anno = Year(data)
   ' Preleva dalla data il mese 
   mese = Month(data)
   ' Preleva dalla data il giorno 
   giorno = Day(data)
   ' Concatena i valori in un unico numero
   DataInNum = anno & mese & giorno 
end function

data = DataInNum (#13/06/2003#)
%>

Questo codice ci trasforma la data 13/06/2003 in 2003613. Ovvero il numero 06 lo trasforma in 6 in quanto elimina le prime cifre se sono uguali a zero. Quindi dovremmo effettuare un controllo sul giorno e sul mese e se sono minori di 10 dovremmo aggiungere lo zero. Così otterremo senza problemi tutti numeri di 8 cifre.

Codice 3.2

<%@ Language=VBScript %>
<% 
' Funzione DataInNum a cui passo una data
function DataInNum(data)
   ' Preleva dalla data l'anno
   anno = Year(data)
   ' Preleva dalla data il mese 
   mese = Month(data)
   ' Preleva dalla data il giorno 
   giorno = Day(data)
   ' Controllo valori < 10
   If mese < 10 then 
     mese = 0 & mese
   End If
   If giorno < 10 then
     giorno = 0 & giorno
   End If
   ' Concatena i valori in un unico numero
   DataInNum = anno & mese & giorno 
end function

data = DataInNum (#13/06/2003#)
%>

Finalmente siamo riusciti ad ottenere il formato migliore per gestire le date. Ora non avremmo nessun problema. Logicamente nel database il campo che contiene la data non dovrà essere in formato data, ma in formato numerico.

Vediamo ora come ottenere la stessa cosa con le ore...

Codice 3.3

<%@ Language=VBScript %>
<% 
' Funzione OraInNum a cui passo l'ora
function OraInNum(ora)
   ' Prelevo l'ora
   ora = Hour(ora)
   ' Prelevo i minuti
   min = Minute(ora)
   ' Prelevo i secondi
   sec = Second(ora)
   ' Controllo valori < 10
   If ora < 10 then 
     ora = 0 & ora
   End If
   If min < 10 then
     min = 0 & min
   End If
   If sec < 10 then
     sec = 0 & sec
   End If
   ' Concatenazioni valori per un unico numero
   OraInNum = ora & min & sec
end function

ora = OraInNum(#2:23:00#)
%>

Da numero a data
Ora è necessario saper trasformare un numero intero prelevato da un database in una data. I metodi sono differenti. Noi, sapendo che il numero è composto obbligatoriamente da 8 cifre (per le date), utilizzeremo Left(), Mid() e Right() per prendere le prime quattro cifre a sinistra (anno), le prime 2 da destra (giorno) e la 5° e 6° cifra (mese). Esistono anche altri metodi (per esempio per divisione, o con il replace()) ma l'uno è valido come l'altro.

Analizziamo il codice, che ora è molto piu' semplice.

Codice 3.4

<%@ Language=VBScript %>
<% 
' Funzione NumInData a cui passo il numero
function NumInData(numero)
   ' Creazione stringa data
   NumInData = Right(numero,2) & "/" & Mid(numero,5,2) & "/" & Left(numero,4)
end function

data = NumInData(20030515)
%>

Con questa funzione se passo il numero 20030515 memorizzerò dentro data la stringa di testo 15/05/2003.

Per ottenere invece l'ora, funzione molto simile, solo che invece di prendere le prime 4 cifre da sinistra, prendo solo le prime 2.

Codice 3.4

<%@ Language=VBScript %>
<% 
' Funzione NumInData a cui passo il numero
function NumInOra(numero)
   ' Creazione stringa ora
   If numero < 99999 then
     NumInOra = Left(numero,1) & ":" & Mid(numero,2,2) & ":" & Right(numero,2)
   Else
     NumInOra = Left(numero,2) & ":" & Mid(numero,3,2) & ":" & Right(numero,2)
   End IF  
end function

ora = NumInOra(053457)
%>

Per l'ora la lunghezza del numero non è fissa, può essere di 5 o 6 numeri. Questo perchè le ore possono iniziare con lo 0, mentre gli anni no (almeno che non parliamo del 104 d.C. o a.C.), quindi c'è un controllo che se il numero è grande 5 allora prende l'ora (1 solo numero) i minuti il 2° e 3° e i secondi gli ultimi 2.



Ti potrebbe interessare anche

commenta la notizia

Ci sono 1 commenti
StefanoRenoldi
ho seguito il tuo ragionamento ma se voglio confrontare due date per stabilire quanti giorni sono passati troverò risultati esatti solo all'interno dello stesso mese perché già se confronto due date in un mese diverso non troverò mai la differenza esatta.

ad esempio confronto 07/05/2013 con 07/04/2013

trasformo in 20130507 e 20130407

se voglio sapere quanti giorni sono passati 20130507 - 20130407 = 100 che è sbagliato.

Ciao.