A classe Date está ultrapassada e deve-se usar Calendar para manipular datas. No entanto, ainda é últil usar,
Date data = new Date()
para obter uma representação do momento presente. A classe Calendar é abstrata, logo, não podemos criar uma instância dela diretamente com o comando,
Calendar calendario = new Calendar();
Devemos usar
Calendar calendario = Calendar.getInstance();
Podemos configurar a data atual representada por um objeto do tipo Calendar por meio de um objeto Date.
calendario.setTime(data);
Operações com datas são facilitadas pelos métodos roll() e add(). Para adicionar, à data atual, meses ou dias, fazemos:
calendario.add(Calendar.MONTH,1); \\será adicionado um mês à data atual.
calendario.add(DAY_OF_WEEK,3); \calendario.add(Calendar.HOUR,-5);\\a data atual será subtraída de 5 horas.
calendario.roll(Calendar.DAY_OF_WEEK,10);\\a data atual será acrescida de 10 dias.
\\no, entanto, se ela ultrapassar o limite do mês, este não será alterado.
A classe DateFormat provê dois métodos importantes para lidar com datas. format(Date d), que transforma um objeto do tipo Date em uma String e parse(String s) que transforma um objeto do tipo String em um objeto do tipo Date. Também a classe DateFormat é abstrata e, por isso, não pode ser instanciada diretamente. Ao invés, usamos:
DateFormat df = DateFormat.getInstance();
DateFormat df1 = DataFormat.getDateInstance();
A diferença entre ambos é que o método format() do primeiro irá produzir uma String que ela em consideração a data e a hora representados em um objeto Date, enquanto o segundo exprime apenas a data representada. O segundo método é sobrecarregado e permite que você passe como parâmetro um estilo para a formatação da data:
DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);
df = DateFormat.getDateInstance(DateFormat.MEDIUM);
df = DateFormat.getDateInstance(DateFormat.LONG);
df = DateFormat.getDateInstance(DateFormat.FULL);
O método parse() lança a exceção ParseException e, por isso, só pode ser usado dentro da cláusula try com a captura da referida exceção. Se a String passada como argumento para o método parse() contém informações apenas sobre a data, mas não sobre a hora, então o objeto Date irá representar a data indicada e irá inicializar as horas e minutos como zerados.