web-dev-qa-db-ja.com

GWTでのクライアント側のタイムゾーンのサポート

次のシナリオをサポートする必要があるGWTアプリに取り組んでいます。
サーバーはタイムゾーンAにあります
クライアントのブラウザがタイムゾーンBに設定されている
GWTアプリは、タイムゾーンCで日付/時刻を表示するように構成されています

GWTはカレンダーをサポートしておらず、javascriptでのタイムゾーンのネイティブサポートは存在しないため、この問題に対する適切でクリーンな解決策は考えられません。

似たようなことをした人はいますか、それとも私が使用できる優れたユーティリティを知っていますか?

ありがとう!

29
Hedenius Access

私の経験では、次のベストプラクティスにより、gwtで日付とタイムゾーンを処理する際の複雑さと混乱が大幅に軽減されます。

  1. アプリケーション内で日付を操作/保存するときは常に、すべての日付をGMTタイムゾーンのエポックからのミリ秒として扱います。 stringまたはintとして保存できますが、実際には違いはありません。
  2. エンドユーザーに日付を表​​示するときは常に、適切なタイムゾーンを使用して日付をフォーマットします。

あなたの場合、サーバー(タイムゾーンA)で日付を作成するときは、クライアントに送信する前に、GMTのエポックからのミリ秒に変換します。クライアントで、 DateTimeFormat を使用して(または独自の日付フォーマッターutilを記述して)、必要に応じてタイムゾーンBまたはタイムゾーンCに変換します。

25
Upgradingdave

GWTのタイムゾーンを変更することはできないため、すべてのJava.util.Dateにはブラウザのタイムゾーンがあります。現在のタイムゾーン設定を手動で処理する必要があります。

3つのオプションがあります。

  1. タイムゾーンの変換は自分で管理します。

  2. Java.util.Date のシリアライザー/デシリアライザーを この投稿では のようにオーバーライドします。そして、おそらくカスタム Java.util.Date 実装を使用して、 getTimezoneOffset() をオーバーライドします。このアプローチでは、GWTAPIの再コンパイルが必要です。

  3. Java.util.Date (オプション2のように)を拡張するか、タイムゾーンオブジェクトでラップすることにより、独自の日付を実装します。このオプションでは CustomFieldSerializer's はまだ役立つかもしれませんが、GWTAPIを再コンパイルする必要はありません。

私はオプション3を好みます。少なくともGWTRPCがいつかCustomFieldSerializerのオーバーライドをサポートするようになるまで


完全な日付/時刻の書式設定のヒント。

6
Fedearne

DaveParoulekの答えは正しいアプローチです。この例をご覧になりたい場合は、TimeZoneとは独立して機能し、必要なすべてのTimeZone情報があるサーバー側で値を処理するウィジェットを作成しました。

TCDateBox --GWT DateBoxのラッパーであり、常にGMTの深夜の日付を選択し、日付ではなくLongとして値を表します。

TCTimeBox -タイムゾーンに関係なく、真夜中から常にミリ秒として時間を選択する新しいウィジェット。これもLongとして表されます。

TCDateTimeUtils -指定されたTimeZoneのUTCDateBoxとUTCTimeBoxに適した2つのLong値に日付を分割し、それらを指定されたTimeZoneの日付に結合するサーバー側コード。

これは、タイムコントロールが一緒に使用されている日付の例です。

それらの実装を説明するブログ記事。

これらのウィジェットはGitHubで入手できます。

3
andykellr

ここでは、サーバーとクライアントの通信にRPC呼び出しを使用していると想定しています。また、タイムゾーンBを気にせず、サーバー上のタイムゾーンCがわかっていると仮定します。

ここにはいくつかのオプションがあります。

  • サーバーで目的の日付を計算し(Javaそこでできることの制限はありません))、それを文字列で送信してクライアントに表示するので、これ以上変換を行う必要はありません。クライアントで。

または:

  • サーバー上のタイムゾーンAとCの間のオフセットを計算し、それをクライアントに渡すすべてのDateオブジェクトに適用して、クライアントに表示するだけです。

何らかの理由でこれらのどれもあなたにとって有効ではなかった場合

  • オフセットを計算し、クライアントに送信して、msに変換し、オフセットを追加してから、Dateオブジェクトを再度作成することにより、サーバーから受信した任意の日付に適用します。
2
Iker Jimenez

私は GWT互換JavaバージョンjsTimezoneDetect Javascriptライブラリ をこの目的のために特別に作成しました。これは(の非常に良い推測)を提供するはずです。 )純粋にクライアント側のタイムゾーン名。お気軽に試してみて、機能するかどうかをお知らせください。

0
Jeff Evans

このデモプロジェクトを参照してください GWTタイムゾーンデモプロジェクト

0
Ramesh Ganesan