miércoles, 9 de noviembre de 2011

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.

11 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