Fechas en Java

   El fin de semana me llamo la atención que varias personas me preguntaran como se manejan las fechas en java, incluso como hacían para restar o sumar días, entre todo esto muchos utilizaban las propiedades de la clase "Date". Esto esta bien si quieres hacer algo simple, pero porque complicarse tanto la vida utilizando esta clase cuando tienes la clase "Calendar", según el API Calendar es una clase abstracta base para convertir entre un objeto de tipo Date (java.util.Date) y un conjunto de campos enteros como YEAR (año), MONTH (mes), DAY (día), HOUR (hora).
    Como en este blog lo que se busca es publicar siempre el código preciso y exacto (aunque no siempre es bueno) vamos directo al punto, el método "getInstance()" nos devuelve un valor del tipo objeto, el cual debemos hacerle un cast a string para poder mostrarlo y manejarlo, podemos utilizar cajas de texto (jTextField), pero como vamos con lo esencial probemos obtener la hora del sistema. Para ello hagamos lo siguiente:
import java.io.*;
import java.util.Calendar;

class MostrarHora{
 public static void main (String [] args) {
  String hora,hor,min,seg;
  Calendar fecha = Calendar.getInstance();
  hor = Integer.toString(fecha.get(Calendar.HOUR_OF_DAY));
  min = Integer.toString(fecha.get(Calendar.MINUTE));
  seg = Integer.toString(fecha.get(Calendar.SECOND));
  hora = hor+":"+min+":"+seg;
  System.out.println(hora);
 }
}
   ¿Que hacemos en este código exactamente?, pues nada complicado, solo creamos variables del tipo texto, hacemos un "Cast" a los valores que son devueltos por el objeto (int) y obtenemos la hora (hour_of_day), minutos (minute) y segundos (second). Luego los unimos todos separados por "dos puntos" ( : ) y la mostramos por pantalla. Ojo, no es necesario hacer el cast ni nada de eso, basta con mostrar por pantalla las variables, esto lo hago solo para mostrar como funciona y hacer un mejor ejemplo.

   Claro, podemos hacer mas cosas, por ejemplo, mostrar la fecha junto con la hora.
import java.io.*;
import java.util.Calendar;

class MostrarFecha{
 public static void main (String [] args) {
  String hora,hor,min,seg,mes,anio,dia;
  Calendar fecha = Calendar.getInstance();
  mes = Integer.toString(fecha.get(Calendar.MONTH));
  anio = Integer.toString(fecha.get(Calendar.YEAR));
  dia = Integer.toString(fecha.get(Calendar.DATE));
  hor = Integer.toString(fecha.get(Calendar.HOUR_OF_DAY));
  min = Integer.toString(fecha.get(Calendar.MINUTE));
  seg = Integer.toString(fecha.get(Calendar.SECOND));
  hora = hor+":"+min+":"+seg;
  System.out.println(hora+" - "+dia+"/"+mes+"/"+anio);
 }
}
   Si corres este ejemplo notaras que la fecha tiene un mes menor al actual, y esto ocurre porque los meses comienzan a trabajar desde 0, el resto de los valores si comienzan en 1, pero nada que un +1 no pueda resolver (existen métodos como el "roll" pero no lo explicare aún porque es para entorno gráfico).

   Podemos setear valores utilizando el método "set()", y sumarlos o restarlos utilizando "add()", para simplificar las cosas veamos un ejemplo de ambos.
import java.io.*;
import java.util.Calendar;

class ModificandoFecha{
 public static void main (String [] args) {
  String mes,anio,dia;
  Calendar fecha = Calendar.getInstance();
  mes = Integer.toString(fecha.get(Calendar.MONTH));
  anio = Integer.toString(fecha.get(Calendar.YEAR));
  dia = Integer.toString(fecha.get(Calendar.DATE));
  System.out.println(dia+"/"+mes+"/"+anio+": Actual");
  /*Año, Mes y Dia, la hora tambien puedo cambiarla
  pero para el ejemplo con esto basta*/
  fecha.set(1990,2,28);
  mes = Integer.toString(fecha.get(Calendar.MONTH));
  anio = Integer.toString(fecha.get(Calendar.YEAR));
  dia = Integer.toString(fecha.get(Calendar.DATE));
  System.out.println(dia+"/"+mes+"/"+anio+": Seteada");
  //Aqui resto dias
  fecha.add(Calendar.DATE, -50);
  mes = Integer.toString(fecha.get(Calendar.MONTH));
  anio = Integer.toString(fecha.get(Calendar.YEAR));
  dia = Integer.toString(fecha.get(Calendar.DATE));
  System.out.println(dia+"/"+mes+"/"+anio+": Restado 50 dias");
  //Aqui sumo años
  fecha.add(Calendar.YEAR, 10);
  mes = Integer.toString(fecha.get(Calendar.MONTH));
  anio = Integer.toString(fecha.get(Calendar.YEAR));
  dia = Integer.toString(fecha.get(Calendar.DATE));
  System.out.println(dia+"/"+mes+"/"+anio+": Sumado 10 anios");
 }
}
   Solo debemos tener en cuenta que el mes comienza en 0 y que podemos "setear" la fecha de la variable a cualquier que nosotros queramos, esto un vistazo por encima de lo que es esta API (muy util y buena por cierto), para encontrar mayor información de los métodos utilizados y sus respectivos constructores podemos entrar a la Página del API.