14/5/14

Fechas (JAVA)

Buena a todos, en esta entrado voy a intentar expliar como funcionan las fechas en java, esta entrada la he creado a raiz de necesitar en un robot (o crawler) una clase que comparase las fechas recuperadas de entradas de blog con la fecha actual.

Al ahcer esto me encontre con varios puntos interesantes de ver.

Lo primero que hice fue crear un método al que le pasaba un webElement de donde recuperaba la fecha y un String indicando como realizar la busqueda. Retorna true si la fecha del blog que tiene el webElement es anterior a la actual:

public Boolean isInRange(WebElement we,String rangeLocator){
      WebElement rangeElement=  we.findElement(By.className(rangeLocator) );
      Date now = new Date();
      Date fecha = new Date(rangeElement.getText());
      return (now.compareTo(fecha) > 0);


}

El priemer problema que me encontre es que cada blog tenia la fecha informada de una forma distinta, este método funcionaria para el blog que presentaba la fecha de forma "dd/mm/yyyy", pero al realizar algunas pruebas encontre otro blog que presentaba la fecha "dd MMM yyyy" donde MMM es ABR o MAY o JUN ..... por lo que me fallaba.

Para resolver este probleme capture la excepcion y realice el siguiente tratamiento de fechas:

public Boolean isInRange(WebElement we,String rangeLocator){
      WebElement rangeElement=  we.findElement(By.className(rangeLocator) );
      Date now = new Date();
      Date fecha;
      try {
          fecha = new Date(rangeElement.getText());
      }catch (java.lang.IllegalArgumentException e1){
          DateFormat df = new SimpleDateFormat("dd-MMM-yyyy");
          DateFormat df2 = new SimpleDateFormat("dd-MM-yyyy");
          String fecha1 = we.findElement(By.className(rangeLocator)).getText();
          String fecha2= fecha1.replaceAll("\n","-");
          Date date = null;
          try {
              fecha = df.parse(fecha2);
          } catch (ParseException e2) {
              e2.printStackTrace();
              fecha = null;
          }
      }
      return (now.compareTo(fecha) > 0);


}

Para comprender este método vamos a explicar el código.

Primero vamos a estudiar las clases Date, SimpleDateFormat, y ya que estamos DateFormat también.

Antes de nada comento que las lineas en la que extraigo la fecha del webElement, no voy a entrar en detalle de explicar que es esto, simplemente os comento que estas lineas:

WebElement rangeElement=  we.findElement(By.className(rangeLocator) );
String fecha1 = we.findElement(By.className(rangeLocator)).getText();

Donde rangeLocator es "date-header", aqui lo único que hace es recuperarnos las fechas en su formato original del código de la web, blog,... según estemos trabajando, estamos usando Selenium (XPATH). En futuro incluiremos en el blog alguna entrada sobre este tema, que es también bastante interesante.

La clase Date, del paquete java.util, encapsula un valor Long representando un momento específico en el tiempo. El constructor más útil es Date(), crea un objeto Date teniendo por valor el día, hora, etc del momento en el cual fue creado.  El método getTime() devuelve un valor Long de un objeto Date. 

En el código creamos now de tipo DATE para poder obtener la fecha actual.

La clase DateFormat se utiliza para poder manejar las feches con facilidad, ya que en todos sitios no se representan las fechas de la misma forma (mascara o idioma), utilizaremos DateFormat para hacerlo como mejor nos convenga. Si utilizamos una instancia de DateFormat sin parámetros, el valor por defecto que se utiliza es el que tiene la máquina donde se ejecuta el programa.

La clase SimpleDateFormat, nos permite construir nuestros propios formatos de fechas, ya que la clase DateFormat tiene limitadas sus instancias. Para construir las fechas con SimlpeDateFormat,  tendremos como referencia un String donde se especificará un patrón para formatear  y/o parsear las fechas.

En el código podemos ver como instanciamos dos veces a esta clase, para poder interpretar la fecha obtenida y para poder asiganar el formato nuevo de fecha donde se almacenará la obtenida.
DateFormat df = new SimpleDateFormat("dd-MMM-yyyy");
DateFormat df2 = new SimpleDateFormat("dd-MM-yyyy");

Proximamente iremos ampliando esta entrada con más información de estas clases.

Os he dejado otra entrada con ejemplos utilizando Calendar, Date, DateFormat.

Un saludo.

No hay comentarios :

Publicar un comentario