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