2011-12-20 5 views
6

Provo a creare un foglio Excel con jxl. Uno del mio campo è una data, e vivo a GMT + 1 TimeZoneJXL e Timezone che scrivono un Excel

Io uso qualcosa di simile per farlo:

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 data è la scrittura nel formato corretto, ma con un -1 valore orario (in GMT) Cerco di trovare una soluzione e ho trovato questo http://www.andykhan.com/jexcelapi/tutorial.html#dates Ma non posso passare un SimpleDateFormat a un DateCell. C'è un modo per farlo? Ora utilizzo java.util.Calendar per aggiungere un'ora, ma è una soluzione orribile. Grazie per l'aiuto!

risposta

2

La classe jxl.write.DateTime ha diversi costruttori (vedere API).

Per impostazione predefinita, utilizzerà il sistema TimeZone per modificare la data. È possibile passare al costruttore un oggetto jxl.write.DateTime.GMTDate per disabilitarlo. Ecco il codice da utilizzare:

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

Grazie per la risposta, ma il problema appaiono ancora: se uso la data e nel costruttore ho messo il DateTime.GMT , l'ora è GMT, e se non metto DateTime.GMT è GMT. Sembra che DateTime usi solo GMT e non il mio fuso orario ... – Enrico

1

Ieri ho avuto lo stesso problema. Vivo nel fuso orario CET (Central European Time) e la semplice creazione della cella DateTime ha spostato il tempo di circa un'ora.

Inizialmente ho provato a impostare il fuso orario su GMT come suggerito nel tutorial ufficiale.

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

Sembra non funzionare. La modifica del tempo era ancora la stessa. Così ho provato a impostare il fuso orario corretto per abbinare il fuso orario in un oggetto Date.

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

Questo ha funzionato perfettamente come mi aspettavo. Ma le cose non devono essere troppo facili, eccetto CET timezone anche CEST (Central European Summer Time) che sposta il tempo di un'altra ora. Quando ho provato a utilizzare le date in ora CEST, non ha funzionato di nuovo perché c'era un'aggiunta di un'ora alla base prevista. Immagino che sarebbe la soluzione per impostare il fuso orario "CEST" invece di "CET" per loro ma non ho capito come ottenere il fuso orario corretto dal Calendar, sempre restituito CET.

Finalmente ho usato una soluzione non bella, ma affidabile.

  • ho un metodo factory per la cella della data di avere una configurazione in un unico luogo
  • a quel metodo, converto il data Date di essere nel fuso orario GMT in un primo momento
  • impostare il formato di fuso orario per GMT
  • disabilita la modifica del fuso orario nella cella DateTime.

Questi passaggi non sono assolutamente puliti ma funzionano per le date CET e CEST.Il codice finale è qui:

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; 
     } 
    } 
} 

E c'è un metodo factory

/** 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

Il tuo codice 'createDate()' è concettualmente sbagliato in quanto Excel/JXL consente solo una quantità limitata di formati di cella per file. Tale codice avrà esito negativo dopo l'aggiunta di alcune quantità di celle. Invece si dovrebbe pre-creare un insieme di formati e quindi usarli, non crearne uno nuovo ogni volta. –

+0

@PavelVlasov Non penso che questo sia "concettualmente sbagliato", tuttavia non conoscevo questa limitazione. Sentiti libero di proporre una modifica del post. Sarò lieto di unirli a loro. – Gaim