2011-12-20 12 views
6

Próbuję utworzyć arkusz Excela z jxl. Jeden z moich pola jest data, a ja mieszkam w GMT + 1 TimeZoneJXL i strefa czasowa zapisywanie Excela

używam coś takiego zrobić:

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

Data jest pisanie w odpowiednim formacie, ale z -1 godzina (w GMT) Próbuję znaleźć rozwiązanie i znalazłem to http://www.andykhan.com/jexcelapi/tutorial.html#dates Ale nie mogę przekazać SimpleDateFormat do DateCell. Jest na to sposób? Teraz używam java.util.Calendar, aby dodać godzinę, ale jest to straszne rozwiązanie. Dziękujemy za pomoc!

Odpowiedz

2

Klasa jxl.write.DateTime ma kilka konstruktorów (porównaj API).

Domyślnie będzie używał systemu TimeZone do modyfikacji daty. Możesz przekazać konstruktorowi obiekt jxl.write.DateTime.GMTDate, aby go wyłączyć. Oto kod, którego należy użyć:

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

dziękuję za odpowiedź, ale problem nadal pojawiają się: jeśli używam datę i konstruktora Włożyłem DateTime.GMT , godzina to GMT, a jeśli nie ustawię DateTime.GMT to GMT. Wygląda na to, że DateTime używa tylko GMT, a nie mojej strefy czasowej ... – Enrico

1

Wczoraj miałem ten sam problem. Mieszkam w strefie czasowej CET (czas środkowoeuropejski) i proste stworzenie komórki DateTime przeniosło czas o około godzinę.

Najpierw próbowałem ustawić strefę czasową na GMT, jak sugeruje oficjalny samouczek.

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

Wygląda na to, że nie działa. Zmiana czasu była wciąż taka sama. Tak więc próbowałem ustawić poprawną strefę czasową, aby dopasować strefę czasową do obiektu Date.

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

To działało idealnie, jak się spodziewałem. Ale rzeczy, które nie są zbyt łatwe, jest poza strefą czasową CET również CEST (środkowoeuropejski czas letni), który przesuwa czas o kolejną godzinę. Kiedy próbowałem używać dat w czasie CEST, to nie działało to ponownie, ponieważ była jedna godzina dodatku do oczekiwanej bazy. Myślę, że byłoby byłoby rozwiązaniem, aby ustawić strefę czasową "CEST" zamiast "CET" dla nich, ale nie wymyśliłem, jak uzyskać właściwą strefę czasową od Calendar, zawsze zwracano CET.

W każdym razie w końcu użyłem niezłego, ale niezawodnie działającego rozwiązania.

  • Mam metody fabryki dla data komórce mieć konfigurację na jednym miejscu
  • w tej metodzie przekonwertować dany Date być w GMT strefy czasowej w pierwszym
  • ustawić format strefę czasową GMT
  • wyłączyć modyfikację strefy czasowej na komórce DateTime.

Kroki te nie są absolutnie czyste, ale działa zarówno w przypadku CET, jak i CEST.Ostateczny kod jest tutaj:

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

i istnieje metoda fabryki

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

Twój kod 'createDate()' jest koncepcyjnie błędny, ponieważ Excel/JXL pozwala tylko na ograniczoną liczbę formatów komórek na plik. Taki kod nie powiedzie się po dodaniu pewnej ilości komórek. Zamiast tego należy wstępnie utworzyć zestaw formatów, a następnie używać ich, nie tworząc za każdym razem nowego. –

+0

@PavelVlasov Nie sądzę, że jest to "konceptualnie błędne", jednak nie znałem tego ograniczenia. Zapraszam do zaproponowania zmiany postu. Chętnie je scalę. – Gaim

Powiązane problemy