/** * LICENCIA LGPL: * * Esta librería es Software Libre; Usted puede redistribuirlo y/o modificarlo * bajo los términos de la GNU Lesser General Public License (LGPL) * tal y como ha sido publicada por la Free Software Foundation; o * bien la versión 2.1 de la Licencia, o (a su elección) cualquier versión posterior. * * Esta librería se distribuye con la esperanza de que sea útil, pero SIN NINGUNA * GARANTÍA; tampoco las implícitas garantías de MERCANTILIDAD o ADECUACIÓN A UN * PROPÓSITO PARTICULAR. Consulte la GNU Lesser General Public License (LGPL) para más * detalles * * Usted debe recibir una copia de la GNU Lesser General Public License (LGPL) * junto con esta librería; si no es así, escriba a la Free Software Foundation Inc. * 51 Franklin Street, 5º Piso, Boston, MA 02110-1301, USA o consulte * <http://www.gnu.org/licenses/>. * * Copyright 2008 Ministerio de Industria, Turismo y Comercio * */ package es.mityc.firmaJava.libreria.utilidades; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import es.mityc.firmaJava.libreria.ConstantesXADES; /** * Clase con utilidades para el tratamiento de fechas * * @author Ministerio de Industria, Turismo y Comercio * @version 0.9 beta */ public class UtilidadFechas implements ConstantesXADES { private static final String FORMATO_FECHA_CON_MILIS = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"; private static final String FORMATO_FECHA_SIN_MILIS = "yyyy-MM-dd'T'HH:mm:ssZ"; /** * Parsea el contenido de una cadena del tipo xsd:DateTime en una fecha * * @param fecha Cadena con la fecha en formato xsd:DateTime * @return Date con la fecha, <code>null</code> si la fecha no se puede convertir */ public static Date parseaFechaXML(final String fecha) { // Primero trata el final de la cadena String res = new String(fecha); // Busca la T int t = res.indexOf("T"); if (t == -1) return null; // A partir de la t busca los dos proximos ":" t = res.indexOf(":", t); if (t == -1) return null; t = res.indexOf(":", t+1); if (t == -1) return null; String formato; // Si hay . es que llegan decimales if (res.indexOf(".", t) > -1) { formato = FORMATO_FECHA_CON_MILIS; } else { formato = FORMATO_FECHA_SIN_MILIS; } // Si no hay ":" posterior es que debe terminar en Z if ((res.indexOf(":", t+1) == -1) && (!res.endsWith(ConstantesXADES.Z_FECHA))) res = res.concat(ConstantesXADES.Z_FECHA); // Si termina en Z lo cambia a UTC y si no es que termina en formato +##:##, lo pasa a +#### if (res.endsWith(ConstantesXADES.Z_FECHA)) { res = res.replace(ConstantesXADES.Z_FECHA, ConstantesXADES.MILIS_FECHA); } else { res = res.substring(0, res.length() - 3).concat(res.substring(res.length() - 2)); } SimpleDateFormat sdf = new SimpleDateFormat(formato); try { Date resultado = sdf.parse(res); return resultado; } catch (ParseException ex) { } return null; } /** * Formatea una fecha para que se ajuste al tipo xsd:DateTime * * @param fecha Fecha a formatear * @return Fecha con el formato xsd:DateTime */ public static String formatFechaXML(final Date fecha) { SimpleDateFormat sdf = new SimpleDateFormat(FORMATO_FECHA_SIN_MILIS); String resultado = sdf.format(fecha); // Añade a la cadena los dos puntos resultado = resultado.substring(0, resultado.length() - 2).concat(DOS_PUNTOS).concat(resultado.substring(resultado.length()-2)); return resultado; } }