2011-12-20 18 views
6

Intento crear una hoja de Excel con jxl. Uno de mi campo es una fecha, y vivo en GMT + 1 zona horariaJXL y Timezone escribiendo un Excel

que usar algo como esto para hacerlo:

WritableCellFormat EXCEL_DATE_FORMATTER = new WritableCellFormat(new DateFormat("dd/MM/yyyy hh:mm")); 
... 
WritableCell cell = null; 
cell = new jxl.write.DateTime(col, row, date); 
cell.setCellFormat(EXCEL_DATE_FORMATTER); 

La fecha está escribiendo en el formato correcto pero con un -1 hora valor (en GMT) Intento encontrar una solución y encontré esto http://www.andykhan.com/jexcelapi/tutorial.html#dates Pero no puedo pasar un SimpleDateFormat a una DateCell. Hay una manera de hacerlo? Ahora estoy usando java.util.Calendar para agregar una hora, pero es una solución horrible. ¡Gracias por ayudar!

Respuesta

2

La clase jxl.write.DateTime tiene varios constructores (API).

Por defecto, se utilizará su zona horaria del sistema para modificar la fecha. Puede pasarle al constructor un objeto jxl.write.DateTime.GMTDate para deshabilitarlo. Aquí está el código que debe usar:

WritableCell cell = null; 
cell = new jxl.write.DateTime(col, row, date, DateTime.GMT); 
+2

Gracias por la respuesta, pero el problema todavía aparece: si uso la fecha y en el constructor me puso el DateTime.GMT , la hora es GMT, y si no pongo DateTime.GMT es GMT. Parece que DateTime usa solo GMT y no mi zona horaria ... – Enrico

1

Ayer tuve un problema similar. Vivo en la zona horaria CET (hora de Europa Central) y la creación simple de la celda DateTime movió el tiempo aproximadamente una hora.

Al principio traté de configurar la zona horaria en GMT como se sugiere en el tutorial oficial.

final DateFormat valueFormatDate = new DateFormat("dd.MM.yyyy HH:mm"); 
valueFormatDate.getDateFormat().setTimeZone(TimeZone.getTimeZone("GMT")); 

Parece que no funciona. La modificación de tiempo seguía siendo la misma. Así que traté de configurar la zona horaria correcta para que coincida con la zona horaria en un objeto Date.

final DateFormat valueFormatDate = new DateFormat("dd.MM.yyyy HH:mm"); 
valueFormatDate.getDateFormat().setTimeZone(TimeZone.getTimeZone("CET")); 

Esto funcionó perfectamente como esperaba. Pero las cosas no son demasiado fáciles, excepto por la zona horaria CET también CEST (horario de verano de Europa Central) que mueve el tiempo aproximadamente una hora más. Cuando traté de usar fechas en CEST, no funcionó porque había una hora adicional a la base esperada. Supongo que sería una solución para configurar la zona horaria "CEST" en lugar de "CET" para ellos pero no encontré la manera de obtener la zona horaria adecuada a partir del Calendar, siempre devolvía CET.

De todos modos, finalmente, he utilizado una solución no es agradable, pero trabajando de forma fiable.

  • tengo un método de fábrica para la celda de fecha para tener una configuración en un solo lugar
  • en ese método, convierto lo dado Date estar en GMT zona horaria en un primer momento
  • configurar el formato de zona horaria a GMT
  • desactivar la modificación zona horaria en DateTime celular.

Estos pasos no son del todo limpios pero funcionan tanto para CET como para CEST.El código final está aquí:

public class DateUtils { 

    // formatter to convert from current timezone 
    private static final SimpleDateFormat DATE_FORMATTER_FROM_CURRENT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 

    // formatter to convert to GMT timezone 
    private static final SimpleDateFormat DATE_FORMATTER_TO_GMT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 

    static { 
     // initialize the GMT formatter 
     final Calendar cal = Calendar.getInstance(new SimpleTimeZone(0, "GMT")); 
     DATE_FORMATTER_TO_GMT.setCalendar(cal); 
    } 

    public static Date toGMT(final Date base) { 
     try { 
      // convert to string and after that convert it back 
      final String date = DATE_FORMATTER_FROM_CURRENT.format(base); 
      return DATE_FORMATTER_TO_GMT.parse(date); 

     } catch (ParseException e) { 
      log.error("Date parsing failed. Conversion to GMT wasn't performed.", e); 
      return base; 
     } 
    } 
} 

Y no es un método de fábrica

/** builds date cell for header */ 
static WritableCell createDate(final int column, final int row, final Date value) { 
    final DateFormat valueFormatDate = new DateFormat("dd.MM.yyyy HH:mm"); 
    valueFormatDate.getDateFormat().setTimeZone(TimeZone.getTimeZone("GMT")); 
    final WritableCellFormat formatDate = new WritableCellFormat(valueFormatDate); 

    // create cell 
    return new DateTime(column, row, toGMT(value), formatDate, DateTime.GMT); 
} 
+0

Su código 'createDate()' es conceptualmente incorrecto ya que Excel/JXL permite solo una cantidad limitada de formatos de celda por archivo. Tal código fallará después de agregar cierta cantidad de celdas. En su lugar, uno debe pre-crear un conjunto de formatos y luego usarlos, no crear uno nuevo cada vez. –

+0

@PavelVlasov No creo que esto sea 'conceptualmente incorrecto', sin embargo, no conocía esa limitación. Siéntase libre de proponer una edición de la publicación. Estaré encantado de fusionarlos. – Gaim