2009-11-06 30 views
29

Tôi đang làm việc trên một ứng dụng GWT mà tôi cần để hỗ trợ các tình huống sau:
Các máy chủ nằm ở múi giờ Một
trình duyệt của khách hàng được thiết lập để múi giờ B
Ứng dụng GWT được định cấu hình để hiển thị ngày/giờ theo múi giờ CKhách hàng hỗ trợ múi giờ bên trong GWT

Vì GWT không hỗ trợ Lịch và hỗ trợ gốc cho thời gian các vùng trong javascript không tồn tại Tôi không thể nghĩ ra giải pháp đẹp và sạch cho vấn đề này.

Có ai trong số các bạn đã làm điều gì đó tương tự hoặc bạn có biết bất kỳ điều gì tốt đẹp utils tôi có thể sử dụng không?

Cảm ơn!

+0

Làm cách nào để xử lý việc sử dụng múi giờ khác với GWT đang sử dụng? – Fedearne

Trả lời

25

Theo kinh nghiệm của tôi, việc thực hành tốt nhất sau đây làm giảm đáng kể độ phức tạp và rắc rối của CustomFieldSerializer khi giao dịch với số ngày và múi giờ trong gwt:

  1. Bất cứ khi nào hoạt động/lưu trữ ngày trong ứng dụng, xử lý tất cả các ngày dưới dạng mili giây kể từ thời gian epoch theo múi giờ GMT. Bạn có thể lưu trữ chúng dưới dạng chuỗi hoặc int, nó không thực sự tạo ra sự khác biệt.
  2. Bất cứ khi nào hiển thị ngày cho người dùng cuối, định dạng ngày bằng múi giờ thích hợp.

Đối với trường hợp của bạn, khi bạn tạo ngày trên máy chủ (múi giờ A) chuyển đổi thành mili giây từ epoch trong GMT trước khi gửi cho khách hàng. Trên máy khách, sử dụng DateTimeFormat (hoặc viết công cụ định dạng ngày tháng của riêng bạn) để chuyển đổi nó thành múi giờ B hoặc múi giờ C nếu thích hợp.

+0

Tôi đã bỏ lỡ phần xử lý các múi giờ trong tài liệu java DateTimeFormat. Dường như nó cung cấp chính xác loại fuctionality tôi cần! Tôi sẽ sử dụng nó kết hợp với cách tiếp cận bạn đề xuất. Cảm ơn! –

2

Tôi giả sử bạn đang sử dụng các cuộc gọi RPC để liên lạc giữa máy chủ và máy khách tại đây. Cũng giả sử rằng bạn không quan tâm đến múi giờ B và bạn biết múi giờ C nào trên máy chủ.

Bạn có một vài tùy chọn ở đây:

  • Tính ngày mong muốn trong máy chủ (không giới hạn Java vào những gì bạn có thể làm ở đó) và gửi nó trong một String để được hiển thị cho khách hàng, vì vậy bạn không phải làm các biến đổi nữa trên máy khách.

hay:

  • Tính bù đắp giữa múi giờ A và C trên máy chủ, áp dụng nó cho tất cả các đối tượng ngày bạn đang đi qua cho khách hàng và chỉ hiển thị chúng trên máy khách.

nếu vì một lý do nào trong số này là hợp lệ cho bạn

  • Tính bù đắp, hãy gửi cho khách hàng và áp dụng nó vào bất kỳ ngày bạn nhận được từ máy chủ bằng cách chuyển đổi để ms, thêm bù đắp và sau đó tạo một đối tượng Date một lần nữa.
6

Bạn không thể thay đổi múi giờ GWT, do đó tất cả java.util.Date đều có múi giờ trình duyệt. Bạn sẽ cần phải xử lý cài đặt múi giờ hiện tại theo cách thủ công.

Tôi thấy 3 lựa chọn:

  1. Bạn quản lý việc chuyển đổi múi giờ chính mình.

  2. Bạn ghi đè bộ nối tiếp/trình giải mã của java.util.Date như in this post. Và có thể sử dụng tùy chỉnh java.util.Date triển khai, ghi đè getTimezoneOffset(). Cách tiếp cận này yêu cầu biên dịch lại API GWT !.

  3. Bạn triển khai Ngày của riêng mình, bằng cách mở rộng java.util.Date (như trong tùy chọn 2) hoặc gói nó với đối tượng múi giờ. Trong tùy chọn này, CustomFieldSerializer's vẫn có thể hữu ích, nhưng không cần phải biên dịch lại API GWT.

Tôi muốn tùy chọn 3.Ít nhất cho đến khi GWT RPC có lẽ một ngày nào đó sẽ hỗ trợ cho trọng


Usefull date/time formatting hints.

+0

đối tượng java.util.Date không có khái niệm về múi giờ. – EisenRatte

3

Dave Paroulek là cách tiếp cận đúng. Nếu bạn muốn xem một ví dụ về điều này, chúng ta đã tạo ra các widget làm việc độc lập với TimeZone và xử lý các giá trị ở phía máy chủ, nơi chúng ta có tất cả thông tin TimeZone mà chúng ta cần.

UTCDateBox - Trình bao bọc quanh Hộp công cụ GWT và luôn chọn ngày vào lúc nửa đêm trong GMT và biểu thị giá trị là Dài thay vì Ngày.

UTCTimeBox - Tiện ích mới luôn chọn thời gian là millis kể từ nửa đêm, độc lập với múi giờ, cũng được biểu thị dưới dạng Dài.

UTCDateTimeUtils - Mã phía máy chủ chia ngày thành 2 giá trị dài thích hợp cho UTCDateBox và UTCTimeBox trong một TimeZone nhất định và kết hợp chúng trở lại ngày trong một khoảng thời gian nhất định.

Here is an example of the date the time controls being used together.

Blog article describing their implementation.

These widgets are available on GitHub.

+0

bummer, tất cả các liên kết bị hỏng bây giờ mà googlecode là xuống. –

+0

Tôi đã cập nhật các liên kết để trỏ đến dự án hiện có tại GitHub. – andykellr

0

Tôi tạo ra một GWT-compatible Java version của jsTimezoneDetect Javascript library đặc biệt cho mục đích này. Điều này sẽ cung cấp một (rất tốt đoán) tên múi giờ hoàn toàn ở phía khách hàng. Hãy thử nó và cho tôi biết nếu nó hoạt động hoặc không hoạt động cho bạn.

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