4

私はここで多くの投稿を読みました:GWTの日付処理。

特に私と一緒にコードを打ったのはこれでした

GAEサーバーからGWTクライアントに日付とタイムゾーンを送信する

とにかく、私が取り組んでいるプロジェクトでは、グリッドにラベルとして日、時間、分間隔を表示できるようにする必要があります。私のチームは、すべての日付/時刻インスタンスがサーバーからISO8601文字列形式でクライアントに渡されるアプローチを採用しています。サーバーのタイムゾーンは、クライアントによって尊重されます。bizのユースケースでは、すべての日付/時刻インスタンスが「市場時間」にあるため、アプリにアクセスするすべてのブラウザーは、「市場時間」タイムゾーンの日付を表示して操作します。夏時間が有効)またはGMT-06:00(標準時が有効な場合)。

ここにGithubにいくつかのソースを投稿しました:

https://github.com/fastnsilver/gwt-datehandling-example

特に...

https://github.com/fastnsilver/gwt-datehandling-example/blob/master/src/main/java/me/fns/gwt/datehandling/client/util/CSTimeUtil.java

およびGWTTestCase

https://github.com/fastnsilver/gwt-datehandling-example/blob/master/src/test/java/me/fns/gwt/datehandling/client/util/CSTimeUtilTestGwt.java

誰かが私たちが日付処理に採用しているユーティリティ(およびテスト)を凝視し、私たちが見ていないものを見るのを手伝ってくれることを期待して。

編集 基本的な問題は、CSTimeUtil#hoursInDay(Date)「移行日」の本番モードで正しく計算されないことです。このメソッドは、他のメソッド(CSTimeUtil#dateToHour(Date)およびなどCSTimeUtil#labelsForDay(Date))で使用されます。

の現在の実装でアプリケーションをデプロイしましたが、機能してCSTimeUtilいるように見えますが、完全ではありません。たとえば、OSのタイムゾーンがUSまたはmvn gwt:test以外のさまざまなタイムゾーンに設定されているWindowsでGWTモードまたは本番モードで実行されている場合、代替のテスト結果に本当に混乱します。 GMT-05:00GMT-06:00

4

2 に答える 2

5

アンドレイからのいくつかのヒントといくつかの深刻な血、汗、涙に基づいて、私はこれを自分で理解しました。Githubのコードを更新したので、興味があれば、そちらをご覧ください。

基礎:

  • サーバーからクライアントに、またはその逆に送信するときに、すべての文字列がISO8601(ミリ秒なし)に準拠していることを確認してください
  • 使用 日DateTimeFormat.getFormat("yyyy-MM-ddTHH:mm:ss.SZZZZ")format日付parse
  • java.util.Dateを使用して「Markettime」からGMTプレフィックス付きのタイムゾーン情報を取得しますDateTimeFormat(Date, TimeZone)。ここで、TimeZoneparamはとして設定されTimeZone.createTimeZone(TZ_CONSTANTS_INSTANCE.americaChicago())、タイムゾーン文字列はによって取得されます。TimeZone.getISOTimeZoneString(Date)
  • ソース日付からの日数(seegenerateDay(Date, int)またはhours )の生成generateHour(Date, int)では、「遷移日」に発生した場合に、インクリメントまたはデクリメントのcoudlがタイムゾーンオフセットの変更をトリガーすることを考慮に入れる必要がありました。
于 2012-11-07T22:37:03.763 に答える
3

タイムゾーンが固定されている場合、なぜ日付/時刻を表すために文字列を使用するのでしょうか。標準のJavaDateオブジェクトをクライアントに送信できます。必要に応じて、すべての日付と時刻をLongsとして保存し、Longsのみを渡すこともできます。また、タイムゾーンのGWTのTimeZone Json文字列を送信します(セッションごとに1回)。それはGWTで見つけることができます-すべてのタイムゾーンの文字列を含むファイルがあります。

クライアントでは、多くの事前定義された形式でDateTimeFormatを使用して、必要なもの(完全な日付、月と日付、日付と時刻など)を表示します。このJson文字列からTimeZoneオブジェクトを作成し、DateTimeFormat.getFormat(... ).format(Date、TimeZone)。

このアプローチでは、DSTの変更(それらはそのJson文字列でエンコードされます)とロケールについて心配する必要はありません。単純なDateオブジェクトまたはLongオブジェクトのみを渡します。

于 2012-11-04T03:33:11.640 に答える