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.


9 Comentarios

Escribir Comentario
Jose Fermin
AUTOR
2 de agosto de 2010, 21:14 delete

orale muchas gracias
termine poniendolo en string xD, para no complicarme la vida por ahorita, y estudiare mas y mejorare la version ggg.
pero me servira en otro proyecto que tengo en mente.
gracias!!

Responder
avatar
11 de agosto de 2010, 23:06 delete

Hola , queria felicitarte, pues tu pagina es excelente .
te mando un abrazo .

Responder
avatar
31 de agosto de 2010, 13:52 delete

Gracias, de cualquier forma siempre estoy atento a cualquier duda o comentario, un saludo y suerte!

Responder
avatar
Anónimo
AUTOR
4 de septiembre de 2012, 20:06 delete

Y si quiero que aparezca la hora y la fecha en un textfiel?

Responder
avatar
4 de septiembre de 2012, 23:17 delete

Utilizando el método anterior solo te quedaría setear el texto:

JTextField.setText(hora+" - "+dia+"/"+mes+"/"+anio);

Responder
avatar
Anónimo
AUTOR
27 de agosto de 2013, 15:25 delete

Muy Bueno su aporte de Verdad lo felicito.
Pero tengo el siguiente problema, no encuentro como solucionarlo. Tengo Un JFormatteTextfield y necesito que cuando el usuario tipee la fecha 1980-06-22 solo capturar el año es decir(1980) para poder restarlo con el año actual. Como haria?

Responder
avatar
29 de agosto de 2013, 8:58 delete

Bueno, podrías tomar la cadena y cambiar el guion ( - ) por un slash ( / ), de esta forma conviertes y puedes sumar o restar fechas....

Responder
avatar
Unknown
AUTOR
5 de enero de 2014, 1:26 delete

gracias me sirvio mucho pero aun tengo una duda es algo e estetica ya que la hora me aparece un solo digito en la fecha por lo menos los meses menores a diez aparece un solo digito como se puede arreglar

Responder
avatar
5 de enero de 2014, 13:53 delete

Saludos....!!! Simplemente debes combinarlo con SimpleDateFormat

Responder
avatar

Lamentablemente hay muchos usuarios en la red que han llegado al blog para escribir obscenidades, así que la moderación se hace necesaria. Recuerda utilizar un lenguaje correcto y espera a que sea aprobado.

Si necesitas publicar código haz click en "Conversión" para hacerlo legible.
ConversiónConversión