Programmazione Java – Tutorial Date

La programmazione in Java offre la possibilità di gestire le date e gli orari con delle proprie classi che sono specializzate nel gestire vari formati di date e orari secondo quelli che sono gli standard di localizzazione geografica e di quel particolare Stato.
Ad esempio la data in formato italiano sovente è definita da un tipo di formato che prevede il giorno del mese, il mese dell’anno e l’anno a quattro cifre con un separatore che può essere “/” o “-“. Ad esempio “14/12/2015” o “15-01-2021” sono date valide. Esiste anche la possibilità di utilizzare date estese che prevedono l’uso del giorno del mese con il giorno della settimana, il mese espresso in lettere e così via.
Nei paese anglosassoni come il “Regno Unito” la data viene espressa prima con l’anno a quattro cifre, poi il mese a due cifre e il giorno del mese a due cifre.
Quindi nel progettare un programma e/o classe in Java che preveda la gestione delle date e degli orari è necessario fissare un formato e sfruttare delle opportune funzioni di conversione se necessario da un formato ad un altro.

Le classi che svolgono questo compito sono diverse e sono:

  • La classe Date per definire oggetti di tipo Data/Orario. La classe Date fa parte del package “java.util”
  • La classe SimpleDataFormat per definire il formato data nella conversione da stringa a Data. E’ necessario fissare un formato “pattern” di data e nell’inserimento da tastiera mediante le classi che gestiscono l’input la data viene letta in formato stringa e quindi deve essere convertita in Date secondo lo standard definito nel pattern. E’ quindi necessario definire anche l’eccezione che deve gestire errati formati inseriti dall’utente. Tale classe fa parte del package “java.text”
  • La classe DataFormat che provvede alla conversione dal valore contenuto nell’oggetto Date in una stringa. E’ necessario quando la Data/Ora deve essere stampata in output. Tale classe fa parte sempre del package “java.text”.
  • La classe ParseException per gestire l’eventuale eccezione che è sollevata se il formato della data inserito non è conforme al pattern prefissato.

Esempio di una classe

In questa classe sono definiti dei valori per un oggetto Persona fra cui la data di nascita e e la classe non fa altro che stampare in output i dati inseriti dall’utente.
Il codice è:

1 package com.mycompany.persona;
2 import java.util.Scanner;
3 import java.util.Date;
4 import java.util.InputMismatchException;
5 import java.text.SimpleDateFormat;
6 import java.text.ParseException;
7 import java.text.DateFormat;
8 public class Persona {
9     private String nome;
10    private String cognome;
11    private Date DataNascita=null;
12    public Persona(String _nome, String _cogn, Date _datan)
13    {
14        this.nome=_nome;
15        this.cognome=_cogn;
16        this.DataNascita=_datan;
17    }
18    public String stampa()
19    {
20        DateFormat df=new SimpleDateFormat("dd/MM/yyyy");
21        String tmp="\nNome e Cognome:"+nome+" "+cognome;
22        String sd=df.format(DataNascita);
23        tmp=tmp+"\nData di Nascita:"+sd+"\n";
24        return tmp;
25    }
26    public static void main(String[] args) {
27       String n="",cg="",d="";
28       Date dn=null;
29       Scanner sc=new Scanner (System.in);
30       SimpleDateFormat formato=new SimpleDateFormat("dd/MM/yyyy");
31        System.out.println("Inserimento dati la date è in formato gg/mm/aaaa");
32        try
33        {
34            System.out.println("\nInserisci nome:");
35            n=sc.nextLine();
36        }
37        catch (InputMismatchException e)
38        {
39            System.out.print("Errpre in inserimento !");
40        }
41        try
42        {
43            System.out.println("\nInserisci Cognome:");
44            cg=sc.nextLine();
45        }
46        catch (InputMismatchException e)
47        {
48            System.out.print("Errpre in inserimento !");
49        }
50        try
51        {
52            System.out.println("\nInserisci Data ad es.: 15/10/2015:");
53            d=sc.nextLine();
54            dn=formato.parse(d);
55        }   
56        catch (ParseException e)
57            {
58                System.out.println("Errore nella data inserita !:");
59                dn=new Date();
60            }
61        
62    
63    Persona p=new Persona(n,cg,dn);
64    System.out.println(p.stampa());
65 }}

Commento al codice

Le righe dalla 1-7 includono le classi per gestire le date, l’input tramite la classe Scanner e le eccezioni sempre legate all’inserimento dati, Le righe dalla 9 alla 25 definiscono ola classe “Persona” con tre attributi nome, cognome di tipo String e “datanascita” di tipo Date, poi è definito il costruttore righe 12-17, e un metodo “stampa” che ritorna la stringa di output. A riga 20 è definito un oggetto della classe “Dataformat” di nome “sd” che provvede nella riga 22 alla conversione dell’attributo “DataNascita” da tipo Date a String.
Nelle righe dalla 25 alla 63 è definito il metodo main. Nel metodo main della classe è definito un oggetto della classe Scanner riga 29, a riga 30 è definito un oggetto della classe SimpleDataFormat e viene definito un pattern per la data in formato “dd/mm/yyyy”.
Nelle righe dalla 32 alla 45 attraverso la try .. catch sono inseriti il nome e il cognome da tastiera. Nelle righe dalla 50 alla 60 è inserita la data e mediante la gestione della ParseException è gestito l’errore nel formato della data. Per default nella catch è assegnato un valore di data costante e predefinito. Esistono vari modi per recuperare l’eccezione. A riga 59 è assegnata la data corrente come valore da attribuire alla data nel caso di errato inserimento. Questo perché altrimenti sarebbe generata una NullPointerException che indica l’oggetto di tipo Date non può essere nullo.
Nella riga 63 è istanziato un oggetto della classe Persona e nella riga 64 sono visualizzati in output i valori degli attributi.