7

java.util.Dateシリアライゼーションとさまざまなクライアント/サーバー ロケールの問題についてしばらく探していました。

この件について知らされていない方のために、以下に簡単な説明を示します。

RPC での GWT 日付シリアル化は、使用しているロケールの関数で行われます。したがって、クライアントとサーバーのロケールが異なる場合、ユーザーが 1 つの日付を入力すると、サーバーはそのロケールに応じて別の日付をデータベースに格納することになります。

これは予期される動作であり、多くの場合、正しい動作のようです。

たとえば、NY のブラウザーから特定の日付/時間に会議をスケジュールする場合、SF で会議の時間をチェックしている人が対応するロケール値を確認するのは正しいことです。

では、生年月日はどうでしょうか。この場合、あなたが 12 月 5 日に生まれた場合、中国の誰かがあなたが 12 月 6 日に生まれたと読んだのは正確ではないようです。

解決策の 1 つは日付の代わりに文字列を使用できるという人もいますが、私はそうは思いません。

したがって、これを解決する最善の方法はカスタム シリアライゼーションだと思いますが、残念ながら GWT は独自のDate_CustomFieldSerializerを提供しています。

そして、私が読んだ限りでは、これに対する唯一の解決策は、このファイルの独自のバージョンを作成し、GWT ソースを再コンパイルすることです。私はそれをしたくないので、誰かがより良い解決策を知っているかどうか、または GWT の人が将来のリリースのためにプラグインのシリアライゼーション インフラストラクチャを計画しているかどうかを尋ねているのはそのためです。

前もって感謝します。ダニエル

4

1 に答える 1

4

Ajava.util.Dateは、ある特定の瞬間を表します。あなたは特定の瞬間に生まれます。あなたのタイムゾーンでは 12 月 5 日だったかもしれませんが、中国では 12 月 6 日であっても、あなたが生まれた正確な瞬間は変わりません。

特定の瞬間ではなく、「日月年」のトリプレットを保存したいようです。その場合は、java.util.Date;ではなく、トリプレット (おそらく文字列としてシリアル化) として保存します。つまり、仕事に適したツールを使用してください。

あなたは、「文字列を足したり引いたりすることができなかった」ので、それは間違っていると思うと言います。日付の足し算も引き算もしません。日付を使って計算したい場合は、実際に日付を保存する必要があることを意味します (そして、中国人の男があなたが 12 月 6 日に生まれたと見なすという事実を受け入れます。あなたのタイムゾーンの日付である 12 月 5 日ではなく、彼のタイムゾーン)、または一時的に DMY トリプレットを日付に変換したい (そしておおよその計算を行うと、中国人の友人があなたの誕生日を 1 日早くしてほしいと願うことになります: 12 月)あなたのタイムゾーンではまだ 12 月 4 日なのに、彼のタイムゾーンでは 5 番目です)。を使用して、日付を DMY にシリアライズ/解析する
のはかなり簡単です(DateTimeFormatyyyy-MM-ddたとえば)、常に現在のタイムゾーンを使用します。

ところで: RPC での GWT 日付シリアル化は、使用しているロケールの関数で行われると言うのは正確ではありません: GWT は日付のタイムスタンプ (によって返されるエポックからの秒数java.util.Date#getTime()) をシリアル化しますが、これは特にタイムゾーンに依存しません。
ロケール != タイムゾーンは言うまでもありません。

于 2012-05-29T13:52:24.273 に答える