次のシナリオをサポートする必要があるGWTアプリに取り組んでいます。
サーバーはタイムゾーンAにあります
クライアントのブラウザがタイムゾーンBに設定されている
GWTアプリは、タイムゾーンCで日付/時刻を表示するように構成されています
GWTはカレンダーをサポートしておらず、javascriptでのタイムゾーンのネイティブサポートは存在しないため、この問題に対する適切でクリーンな解決策は考えられません。
似たようなことをした人はいますか、それとも私が使用できる優れたユーティリティを知っていますか?
ありがとう!
私の経験では、次のベストプラクティスにより、gwtで日付とタイムゾーンを処理する際の複雑さと混乱が大幅に軽減されます。
あなたの場合、サーバー(タイムゾーンA)で日付を作成するときは、クライアントに送信する前に、GMTのエポックからのミリ秒に変換します。クライアントで、 DateTimeFormat を使用して(または独自の日付フォーマッターutilを記述して)、必要に応じてタイムゾーンBまたはタイムゾーンCに変換します。
GWTのタイムゾーンを変更することはできないため、すべてのJava.util.Dateにはブラウザのタイムゾーンがあります。現在のタイムゾーン設定を手動で処理する必要があります。
3つのオプションがあります。
タイムゾーンの変換は自分で管理します。
Java.util.Date のシリアライザー/デシリアライザーを この投稿では のようにオーバーライドします。そして、おそらくカスタム Java.util.Date 実装を使用して、 getTimezoneOffset() をオーバーライドします。このアプローチでは、GWTAPIの再コンパイルが必要です。
Java.util.Date (オプション2のように)を拡張するか、タイムゾーンオブジェクトでラップすることにより、独自の日付を実装します。このオプションでは CustomFieldSerializer's はまだ役立つかもしれませんが、GWTAPIを再コンパイルする必要はありません。
私はオプション3を好みます。少なくともGWTRPCがいつかCustomFieldSerializerのオーバーライドをサポートするようになるまで
DaveParoulekの答えは正しいアプローチです。この例をご覧になりたい場合は、TimeZoneとは独立して機能し、必要なすべてのTimeZone情報があるサーバー側で値を処理するウィジェットを作成しました。
TCDateBox --GWT DateBoxのラッパーであり、常にGMTの深夜の日付を選択し、日付ではなくLongとして値を表します。
TCTimeBox -タイムゾーンに関係なく、真夜中から常にミリ秒として時間を選択する新しいウィジェット。これもLongとして表されます。
TCDateTimeUtils -指定されたTimeZoneのUTCDateBoxとUTCTimeBoxに適した2つのLong値に日付を分割し、それらを指定されたTimeZoneの日付に結合するサーバー側コード。
ここでは、サーバーとクライアントの通信にRPC呼び出しを使用していると想定しています。また、タイムゾーンBを気にせず、サーバー上のタイムゾーンCがわかっていると仮定します。
ここにはいくつかのオプションがあります。
または:
何らかの理由でこれらのどれもあなたにとって有効ではなかった場合
私は GWT互換Javaバージョン の jsTimezoneDetect Javascriptライブラリ をこの目的のために特別に作成しました。これは(の非常に良い推測)を提供するはずです。 )純粋にクライアント側のタイムゾーン名。お気軽に試してみて、機能するかどうかをお知らせください。
このデモプロジェクトを参照してください GWTタイムゾーンデモプロジェクト