|
Lavorare con le date in Java
Verificare le date
Vediamo come, a partire da una data in formato stringa se ne possa verificare la validità mediante un programma Java.
Formattare le date
Dato un oggetto java Date, vogliamo ottenere la data sotto forma di stringa e con un dato formalismo grafico prestabilito.
Da string a Data
Data una stringa che rappresenta una data vogliamo l'oggetto date corrispondente.
|
Problema: Abbiamo una stringa che rappresenta una data, la stringa è nel formato YYYYMMDD. Ad es.
20090115. Vogliamo verificare, mediante un programma Java, se questa stringa rappresenti una data vera e propria. Ovvero, dobbiamo verificare se i valori siano tutti
numerici e in caso affermativo rappresentino effettivamente una data reale. Ad es. il valore 20090235 non rappresenta una data reale dato che il mese di febbraio non ha
35 giorni!
Soluzione: Ecco una funzione Java per fare questo.
/**
* Funzione per la verifica della corretteza di una data.
* La data di ingresso è nel formato YYYYMMDD. Questa funzione verifica che
* MM sia compreso tra 1 e 12 e che di conseguenza il giorno sia corretto.
* E' che tutti i dati siano numerici.
*
* @param testDate data da verificare nel formato stringa YYYYMMDD
* @return
*/
public boolean verifyDate(String testDate)
{
if(testDate.length()!=10)
return false;
String year = testDate.substring(0, 4);
String month = testDate.substring(4, 6);
String day = testDate.substring(6, 8);
int yearI = 0;
int monthI = 0;
int dayI = 0;
Calendar myCal = GregorianCalendar.getInstance(TimeZone.getTimeZone("Etc/UTC"));
int minMonth = myCal.getActualMinimum(Calendar.MONTH)+1;
int maxMonth = myCal.getActualMaximum(Calendar.MONTH)+1;
int minDay = 0;
int maxDay = 0;
try{
yearI = Integer.parseInt(year);
myCal.set(Calendar.YEAR, yearI);
monthI = Integer.parseInt(month);
if(!(monthI>=minMonth && monthI<=maxMonth))
return false;
myCal.set(Calendar.MONTH, monthI-1);
minDay = myCal.getActualMinimum(Calendar.DAY_OF_MONTH);
maxDay = myCal.getActualMaximum(Calendar.DAY_OF_MONTH);
dayI = Integer.parseInt(day);
if(!(dayI>=minDay && dayI<=maxDay))
return false;
myCal.set(Calendar.DAY_OF_MONTH, dayI);
}catch(NumberFormatException nfe)
{
return false;
}
return true;
}
Questa funzione Java restituisce TRUE se la verifica è andata a buon fine, FALSE altrimenti.
Problema:
Java e il problema della formattazione delle date.
Vediamo come risolvere il problema con una funzione molto generale.
Dato un oggetto java Date, vogliamo ottenere la data sotto forma di stringa e con un dato formalismo grafico prestabilito. A volte si hanno un sacco di problemi con
l'utilizzo di specifici timezone. Con la funzione proposta non ci dovrebbe essere alcun problema.
Soluzione:
Ecco il metodo da utilizzare:
java.util.Date myDate = ...oggetto date pre-esistente o creato ad hoc
//Si crea per prima cosa l'oggetto Calendar
Calendar myCal = GregorianCalendar.getInstance(TimeZone.getTimeZone("Etc/UTC"));
myCal.setTime(this.getNascita());
//Si formatta la data nella maniera voluta
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
//Si converte la data in stringa
String dataStringa = sdf.format(myCal.getTime());
Problema: A partire da una data sotto forma di stringa e con un dato formato, vogliamo controllare la
stringa e ottenere un oggetto Date corrispondente.
Soluzione:
/**
* Da una stringa in formato gg/mm/aaaa restituisce una oggetto Date.
* Viene verificata anche la correttezza della stringa.
*
* @param testDate
* @return
*/
public Date stringToDate(String testDate)
{
if(testDate.length()!=10)
return null;
String day = testDate.substring(0, 2);
String month = testDate.substring(3, 5);
String year = testDate.substring(6, 10);
int yearI = 0;
int monthI = 0;
int dayI = 0;
Calendar myCal = GregorianCalendar.getInstance(TimeZone.getTimeZone("Etc/UTC"));
int minMonth = myCal.getActualMinimum(Calendar.MONTH)+1;
int maxMonth = myCal.getActualMaximum(Calendar.MONTH)+1;
int minDay = 0;
int maxDay = 0;
try{
yearI = Integer.parseInt(year);
myCal.set(Calendar.YEAR, yearI);
monthI = Integer.parseInt(month);
if(!(monthI>=minMonth && monthI<=maxMonth))
return null;
myCal.set(Calendar.MONTH, monthI-1);
minDay = myCal.getActualMinimum(Calendar.DAY_OF_MONTH);
maxDay = myCal.getActualMaximum(Calendar.DAY_OF_MONTH);
dayI = Integer.parseInt(day);
if(!(dayI>=minDay && dayI<=maxDay))
return null;
myCal.set(Calendar.DAY_OF_MONTH, dayI);
}catch(NumberFormatException nfe)
{
return null;
}
return myCal.getTime();
}
Piccola Nota
L'uso della funzione TimeZone.getTimeZone("UTC"), ovvero con il codice UTC, potrebbe generare una eccezione FileNotFoundException. I timezone di default usati
da java si trovano al seguente percorso
C:\Programmi\Java\jdk1.6.0_13\jre\lib\zi
Qua dentro il file UTC non è più presente ma è presente in Etc/UTC. Quindi la maniera corrette con cui invocare la funzione è TimeZone.getTimeZone("Etc/UTC").
|