2011-12-20 38 views
6

Tôi cố tạo một trang tính Excel bằng jxl. Một trong những lĩnh vực của tôi là một ngày, và tôi sống trong GMT + 1 TimeZoneJXL và Múi giờ viết một Excel

tôi sử dụng một cái gì đó như thế này để làm điều đó:

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

Ngày được viết bằng định dạng đúng nhưng với một -1 giá trị giờ (theo GMT) Tôi cố gắng tìm một giải pháp và tôi đã tìm thấy số này http://www.andykhan.com/jexcelapi/tutorial.html#dates Nhưng tôi không thể chuyển SimpleDateFormat cho một DateCell. Có cách nào để làm điều đó? Bây giờ tôi sử dụng java.util.Calendar để thêm một giờ, nhưng là một giải pháp khủng khiếp. Cảm ơn bạn đã trợ giúp!

Trả lời

2

Lớp jxl.write.DateTime có một số hàm tạo (xem API).

Theo mặc định, nó sẽ sử dụng TimeZone hệ thống của bạn để sửa đổi ngày. Bạn có thể truyền cho hàm tạo một đối tượng jxl.write.DateTime.GMTDate để vô hiệu hóa điều này. Đây là mã bạn nên sử dụng:

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

Thank cho câu trả lời, nhưng vấn đề vẫn xuất hiện: nếu tôi sử dụng ngày và trong constructor tôi đặt DateTime.GMT , giờ là GMT, và nếu tôi không đặt DateTime.GMT là GMT. Dường như DateTime chỉ sử dụng GMT và không phải là múi giờ của tôi ... – Enrico

1

Hôm qua tôi có cùng một vấn đề. Tôi sống trong múi giờ CET (Giờ Trung Âu) và việc tạo đơn giản của ô DateTime đã di chuyển thời gian khoảng một giờ.

Lúc đầu, tôi đã cố gắng đặt múi giờ theo số GMT như được đề xuất trong hướng dẫn chính thức.

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

Dường như nó không hoạt động. Thời gian sửa đổi vẫn như cũ. Vì vậy, tôi đã cố gắng thiết lập múi giờ chính xác để phù hợp với múi giờ trong một đối tượng Date.

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

Điều này làm việc hoàn hảo như tôi mong đợi. Nhưng những điều không phải là quá dễ dàng, có ngoại trừ CET múi giờ cũng CEST (Trung Âu thời gian mùa hè) mà di chuyển thời gian khoảng một giờ. Khi tôi cố gắng sử dụng ngày trong thời gian CEST, nó đã không hoạt động trở lại vì có thêm một giờ vào cơ sở dự kiến. Tôi đoán rằng nó sẽ là giải pháp để thiết lập múi giờ "CEST" thay vì "CET" cho họ nhưng tôi đã không tìm ra cách để có được múi giờ thích hợp từ Calendar, nó luôn trả về CET.

Dù sao cuối cùng tôi đã sử dụng một giải pháp không tốt, nhưng đáng tin cậy.

  • Tôi có một phương pháp nhà máy cho tế bào ngày để có một cấu hình trên một nơi duy nhất
  • trong phương pháp đó, tôi chuyển đổi cho Date được trong giờ múi giờ lúc đầu
  • thiết lập định dạng múi giờ để GMT
  • tắt sửa đổi múi giờ trên DateTime ô.

Các bước này không hoàn toàn sạch sẽ nhưng hoạt động đối với CET cũng như ngày CEST.Các mã cuối cùng là ở đây:

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

Và có một phương pháp nhà máy

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

Mã 'createDate()' của bạn là sai về mặt khái niệm vì Excel/JXL chỉ cho phép một số lượng hạn chế các định dạng ô cho mỗi tệp. Mã như vậy sẽ thất bại sau khi một số lượng ô được thêm vào. Thay vào đó, bạn nên tạo trước một bộ định dạng và sau đó sử dụng chúng, chứ không phải tạo một định dạng mới mỗi lần. –

+0

@PavelVlasov Tôi không nghĩ rằng đây là 'khái niệm sai', tuy nhiên, tôi không biết giới hạn đó. Vui lòng đề xuất chỉnh sửa bài đăng. Tôi sẽ rất vui khi hợp nhất chúng. – Gaim

Các vấn đề liên quan