jueves, 18 de febrero de 2010

Manejo de Fechas en Java incluidos TimeStamp y Unix Timestamp

Mientras desarrollo el sistema que acompaña mi proyecto de tesis van surgiendo algunos puntos que deben irse tratando en el camino cuando desarrollaba un modulo en java que monitoriza los accesos de los estudiantes al EVA (Entorno Virtual de Aprendizaje) de mi Universidad, desarrollado bajo moodle, me encontre con que las fechas se manejaban mediante un sistema denominado unix timestamp que segun dice la literatura es usado en todos los sitemas unix y algunos motores de bases de datos... y Segun consite en que desde el primero de enero de 1970 se cuentan los segundos hasta la fecha que se desea obtener y con eso se tiene una fecha exacta hasta el nivel de segundos de algun acontesimiento. Y fue aqui cuando empeso mi calvario, busque mil y una formas de como pasar ese valor a una fecha mas tratable en java ya que necesitaba hacer comparaciones entre las mismas. No encontre practicamente nada asi que toco hacer un estudio intensivo de clases de fechas y como mismo podia interpretar los valores unix timestamp en java. El relajo empezo cuando descubri que los timestamps en java esta en nanosegundos asi que tocaba equiparalos... y bueno despues de tanta introduccion les dejo el codigo resultante para ver si a alguna persona le quito mas de un dolor de cabeza.

Codigo fuente

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 *
 * @author juankasar
 */
public class Tiempos {
    public static Date unixTimestampToDate(String fecha) {
        Date resultado=null;
        Date aux = stringToDate("1970-01-01 00:00:00");
        Timestamp aux1 = dateToTimeStamp(aux);
        long val = (Long) Long.valueOf(fecha);
        val = val * 1000;
        val = val + aux1.getTime();
        Timestamp aux2 = new Timestamp(val);
        resultado = timestampToDate(aux2);
        return resultado;
    }

    public static String dateToUnixTimestamp(Date fecha){
        String res = "";
        Date aux = stringToDate("1970-01-01 00:00:00");
        Timestamp aux1 = dateToTimeStamp(aux);
        Timestamp aux2 = dateToTimeStamp(fecha);
        long diferenciaMils = aux2.getTime() - aux1.getTime();
        long segundos = diferenciaMils / 1000;
        return res+segundos;
    }

    public static String dateToString(Date fecha){
        String result = null;
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        result = format.format(fecha);
        return result;
    }
    
    public static Date stringToDate(String fecha){
        // Solo funciona con string en el formato yyyy-MM-dd HH:mm:ss
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date res = null;
        try{
                res = format.parse(fecha);
        }catch(Exception e){}
        return res;
    }

    public static Timestamp dateToTimeStamp(Date fecha){
        return new Timestamp(fecha.getTime());
    }

    public static Date fechaHoraSistema(){
        return new Date(System.currentTimeMillis());
    }

    private static Date timestampToDate(Timestamp timestamp) {
        return new Date(timestamp.getTime());
    }
}

Saludos Espero que les sirva

1 comentario:

Unknown dijo...

Extraordinario aporte, muchas gracias por compartir tu conocimiento, la verdad me estaba canzando de buscar y esto me sirvio mucho.