Ir al contenido principal

Fechas en Java

En este pequeño post voy a mostrar algunas trucos básicos para trabajar con fechas cuando estamos programando en Java. Espero que os sean útiles:

Si queremos crear un objeto Date con la fecha actual tenemos que ejecutar la sentencia:


Date fechaActual = new Date();


Si lo que queremos en crear un objeto Date con una fecha determinada, digamos 31/12/2012, podemos utilizar la clase SimpleDateFormat:

SimpleDateFormat formateador = new SimpleDateFormat("yyyyMMdd");
formateador.parse("2012/12/31");


También a veces tenemos que imprimir fechas en un formato determinado. Esto también se consigue mediante    máscaras y la clase SimpleDateFormat. Imaginemos que tenemos un objeto Date con la fecha 31 de Diciembre de 2012. Si queremos imprimir por pantalla la fecha en el formato 31-12-2012 podemos utilizar las siguientes sentencias:

SimpleDateFormat formateador = new SimpleDateFormat("dd-MM-yyyy");
System.out.println(formateador.format(fechaObjetoDate));

Si queremos comprobar si una fecha es mayor que otra debemos utilizar el método compareTo:


if (fechaObjetoDate1.compareTo(fechaObjetoDate2) >= 0 ) {
  System.out.println("La fecha 1 es posterior a la fecha 2");
}

Si queremos encapsular la hora y la fecha actual en un mismo objeto podemos utilizar la clase Timestamp:


Timestamp horaFecha = new Timestamp(System.currentTimeMillis());

Otro objeto para trabajar con fechas puede ser el objeto Calendar. Para crear un objeto Calendar con la fecha actual utilizamos la siguiente sentencia:

Calendar calendar = Calendar.getInstance();

A veces lo que queremos es transformar un objeto Date a Calendar. Lo que tenemos que hacer en este caso es convertirlo de la siguiente forma:

Calendar calendar = Calendar.getInstance();
calendar.setTime(objetoDate);

Y en otras ocasiones lo que queremos conseguir es un objeto Date a partir de un Calendar. En este caso lo debemos convertir con las siguientes sentencias:

Calendar calendar = Calendar.getInstance();
calendar.getTime();

Para inicializar un objeto Calendar con una fecha determinada sin utilizar el objeto Date:


Calendar fecha= Calendar.getInstance();
fecha.set(2011, 9, 25); // (Año, Mes, Dia). El Mes es un número menos. Enero=0, Febrero=1...


Para calcular los días transcurridos entre dos fechas podemos utilizar el siguiente método:

public static int diasTranscurridosEntre(Date fechaDesde, Date fechaHasta) {
 long diff = fechaHasta.getTime() - fechaDesde.getTime();
 long dias = diff / (1000 * 60 * 60 * 24);
 return (int) dias;
}

Para sumar un número de meses a una fecha podemos utilizar el siguiente método:


public static Date sumarMesesAFecha(Date f, int meses) {
  Calendar c = Calendar.getInstance();
  c.setTime(f);
  c.add(Calendar.MONTH, meses);  
  return c.getTime();
 }

Para sumar un número de días a una fecha podemos utilizar el siguiente método:

public static Date sumarDiasAFecha(Date f, int dias) {
  Calendar c = Calendar.getInstance();
  c.setTime(f);
  c.add(Calendar.DATE, dias);  
  return c.getTime();
 }

Si tenéis alguna duda sobre fechas en Java o alguna otra cuestión sobre programación podéis expresarla en los comentarios del blog.

Salu2.

Comentarios

  1. Cómo puedo obtener el lunes previo a una fecha dada¿?
    Ejemplo: si paso la fecha 22/11/2011, que me devuelva 21/11/2011

    Gracias.

    ResponderEliminar
  2. Hola buenos días.

    De los ejemplos puedes sacar la información.

    Para obtener el día 22/11/2011:

    Calendar fecha= Calendar.getInstance();
    fecha.set(2011, 10, 22);
    Date fechaD = fecha.getTime();

    Para obtener el día anterior utiliza la función que pongo pasando los días en negativo:

    SumarDiasAFecha(fechaD, -1).

    ¿Te aclara esto tu duda?

    ResponderEliminar
  3. No exactamente, no sólo tiene que ser un día anterior, por ejemplo, ahora imagina que la fecha es el día 25/11/2011, la duda es: ¿Cómo puedo saber qué día es el primer lunes que precede a esta fecha?

    Saludos y gracias por responder tan rápido.

    ResponderEliminar
  4. Hola de nuevo.

    Creo que el código que necesitas es el siguiente:

    Calendar c = Calendar.getInstance();
    c.set(2011,10,25);

    while (c.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
    c.add(Calendar.DATE, -1);
    }
    System.out.println(c.get(Calendar.DATE));
    System.out.println(c.get(Calendar.MONTH));
    System.out.println(c.get(Calendar.YEAR));

    Espero haberte ayudado.

    Salu2.

    ResponderEliminar
  5. hola!¿ como podemos hacer para encontrar la edad de una persona apartir d ela realizacion de fecha en java

    ResponderEliminar
  6. Amigo Pascu, el codigo sobre el lunes anterior nos ha salvado la vida.
    Muuuuchass gracias!!!!

    ResponderEliminar
  7. Como puedo validar una fecha en un metodo que por ejemplo el usuario introduce 35/13/2012 que valide que sea real ya que no hay es con 35 dias y mucho menos 13 meses y ademas que la fecha sea posterior a la fecha actual. si no es valida qe marque error al usuario y asigne la fecha actual

    ResponderEliminar
  8. Hola pascu !
    Estoy intentado hacer una aplicacion soy principiante en esto de java...
    la cuestio es que quiero hacer un calendario lunar para mi y mis amigos para pescar.
    se como sacar el cilclo de la luna.

    package AplicacionCicloLunar;

    import java.util.*;

    public class Ciclo {
    public static void main(String[]args){

    Calendar ciclo = Calendar.getInstance();

    //Declaración de las Variables: Horas, Minutos, Dias, Mes y Año
    int horas = ciclo.get(Calendar.HOUR_OF_DAY);
    int minutos = ciclo.get(Calendar.MINUTE);
    int mes = ciclo.get(Calendar.MONTH) + 1;
    int dias = ciclo.get(Calendar.DAY_OF_MONTH);
    int ano = ciclo.get(Calendar.YEAR);

    //Operación para sacar el año Lunar (Epacta)
    int res = ano + 1; //Hay que sumarle 1 al año
    int resto = res % 19; //Dividirlo entre 19 y sacar el resto
    int resto1 = resto - 1 * 11; //Al resto restarle 1 y multiplicarlo por 11
    int epacta = resto1 % 30; // Ahora se divide por 30 y se le saca el resto

    //Apartir de marzo hay que ir sumandole uno a cada mes
    if(mes<2){
    mes=0;
    }else{
    if(mes<13){
    mes = mes-2;
    }else{
    System.out.println("Uff... algo va mal");
    }

    //Ahora hay que sumar el año epacto + el dia + el mes y si pasa de 28 dividirlo por 30
    int resultado;
    if (dias >= 29){

    resultado = ano + dias + mes / 30;
    }else{

    resultado = epacta + dias + mes;

    }
    System.out.println(resultado); //El resultado es el dia en el que estoy del ciclo lunar

    }
    }
    }

    como podria hacer jungando con el calendario para algo parecido a esta imagen ??

    http://img705.imageshack.us/img705/4624/sinttulo1pxo.jpg

    No espero que me hagas el codigo pero si pudieras orientarme te estaria muy agradecido o me digas un ejemplo tipo...

    "Pues deberias hacer un ciclo while con un for que haga esto o lo otro..."

    Mil Gracias de antemano

    ResponderEliminar
  9. Como le hago para que el mes de enero me aparezca como mes 1? es que me sale 0 y se ve asqueroso asi

    ResponderEliminar
  10. Como puedo obtener unicamente el año de la fecha

    ResponderEliminar
  11. Hola,

    Gracias por la ayuda. Sólo quería decirte que donde pone:

    SimpleDateFormat formateador =
    new

    SimpleDateFormat(
    "yyyyMMdd"
    );
    formateador.parse(
    "2012/12/31"
    );


    Es:

    SimpleDateFormat formateador =
    new

    SimpleDateFormat(
    "yyyyMMdd"
    );
    formateador.parse(
    "20121231"
    );

    ResponderEliminar
  12. al comentario anterior.. tambien se le puede poner el ("2012/12/31") pues el formateador te lo cambiara al formato predeterminado ..



    igual este comentario es de hace muchos años.. pero por si alguien como yo lo ve apenas xD xD

    ResponderEliminar
  13. hola buenos dias me podrian ayudar a usar un campo de fecha de base de datos sql la vdd no soy bueno en esto voy empezando ya abri el campo en la base pero como lo ocupo desde java lo tengo como Fechainsercion por que quiero comprobar y comparar tareas con las de un dia anterior me ayudan?
    de favor

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

Soluciones Alchemy Classic 389 elementos

Hace algún tiempo salió una actualización del Juego Alchemy Classic en la que aparecían más elementos (389 en lugar de 238). Aparte de añadir elementos mejoran algunas traducciones en castellano y mejoran la interfaz, aunque todavía hay algún error en algunos nombres de elementos. Aquí os dejo las soluciones para los que estén atascados y no puedan dormir por las noches: Sustancia primaria Aire=Elemento primario  Fuego=Elemento primario  Agua=Elemento primario  Tierra=Sustancia Primaria Arena=Piedra + Aire Piedra=Tierra + Fuego Arcilla=Arena + Pantano Caliza=Tierra + Amonitas Carbono=Fuego + Madera Cloro=Fuego + Sal + Electricidad CO2(Dióxido de Carbono)=Ceniza + Ácido nítrico Electricidad=Relámpago+ Metales Gas natural= Yacimiento de gas + Pozo Helio=Refinería de gas + Gas Natural Hidrógeno=Electricidad + Agua Hielo=Frío + Agua Imán=Piedra + Metales Metano=Deshechos Vegetales + Pantano Oxígeno=Electricidad + Agua Petróleo=Unidad

JAXB: Leer y escribir ficheros XML

Muchas veces en nuestras aplicaciones debemos manejar documentos XML ( Extensible Markup Language ). Este lenguaje se ha convertido en un estándar para intercambio de datos entre programas y aplicaciones a través de Internet. En un esquema XML (o  XSD ) podemos definir los elementos que pueden aparecer en un documento XML así como las relaciones entre los mismos. JAXB ( Java Architecture for XML Binding ) es un estándar Java para transformar un esquema XML (o  XSD ) en una representación a objetos java. Mediante la API de JAXB podemos mapear un objeto Java a un documento XML ( "marshall" ) y el proceso contrario, es decir, a partir de un esquema XML crear su conjunto de objeto Java asociado ( "unmarshall" ). JAXB Resumiendo lo que nos proporciona JAXB es: Generación de objetos Java a partir de un XSD a través de un compilador Proporciona capacidades de marshall/unmarshall (escribir fichero XML desde java y al contrario) Integración con Maven a través de xj

Matemáticas y cine.

El otro día estaba viendo por la televisión una película llamada 21 blackjack . En una escena de la película el profesor de matemáticas ( Kevin Spacey ) le presenta a uno de sus alumnos la siguiente situación: se encuentra en un concurso en la que debe escoger entre tres puertas (1,2 y 3). En dos de ellas hay una cabra, sin embargo en una de las 3 hay un flamante coche nuevo. El alumno responde que quiere abrir la puerta. El presentador, conocedor de lo que hay detrás de cada puerta decide abrir otra puerta diferente mostrando detrás de ella una cabra. El profesor se dirige al alumno y le pregunta, ¿cambiarías la puerta o te quedarías con la puerta que tienes? Muchos de nosotros cambiaríamos de puerta pensando que es una treta del presentador para engañarnos. ¿Cual elegiríais vosotros? Al comienzo tenemos 1/3 de probabilidades de acertar la puerta donde está el coche. Una vez que el presentador abre la puerta con una cabra, la mayoría de gente piensa que hay la misma probabilidad de