3

私はGWTRPCを使用して、日付を含む文字列をクライアントからサーバーに送信しています(これは、要求ヘッダー上にあるため、この方法で行う必要があります)。

サーバー側では、SimpleDateFormatを使用してその文字列を解析し、必要なロジックを作成します。

携帯電話とコンピューターの両方を異なるタイムゾーンに設定しており、ホストモードを使用して、tomcatでテストプロジェクトを実行します。

コードは次のとおりです。

クライアント:

DateTimeFormat dtf = DateTimeFormat.getFormat("yyyy-MM-dd HH:mm:ss Z");
Date date = new Date();

System.out.println("client: " + date.toString());
System.out.println("client: " + dtf.format(date));
builder.setHeader("Date1", dtf.format(date));

サーバ:

String dateHeader = request.getHeader("Date1");
System.out.println("Server date header from client: " + dateHeader);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");

System.out.println("x = " + sdf.parse(dateHeader));
System.out.println("Timezone = " + df.getTimeZone().getDisplayName());

結果:

ホストモード
クライアント:水4月11日17:29:49 2012年11月
クライアント:2012-04-11 17:29:49 +0700
クライアントからのサーバー日付ヘッダー:2012-04-11 17:29:49 +0700x
=水4月1117:29:492012年11月


TomCat

  1. PCの使用:クライアントとサーバーは同時に使用できます。

(明らかに、クライアントの印刷物を見ることができません)

クライアントからのサーバー日付ヘッダー:2012-04-11 17:31:37 +0700
x = Wed Apr 11 17:31:37 NOVST 2012

  1. 携帯電話のクライアントは、サーバーとは異なります。

クライアントからのサーバー日付ヘッダー:2012-04-11 15:34:35 +0500
x = Wed Apr 11 17:34:35 NOVST 2012

結論:SimpleDateFormatは、文字列に含まれるタイムゾーンを無視します。欲しくない!これを正しく機能させたい。どうすればこれを機能させることができますか?よろしくお願いします。

4

1 に答える 1

1

SimpleDateFormat15:34: 35+0500を17:34: 35NOVSTNOVSTはローカルタイムゾーンの+0700)に解析するため、タイムゾーンを無視しません。これはjava.util.Date、エポックからのタイムスタンプにすぎません。タイムゾーンの概念はありません(javadocを参照してください:すべてがローカルタイムゾーンに関連しています)。

サーバー側でクライアントのタイムゾーンを取得する場合は、シリアル化された日付からタイムゾーンフィールドを解析する必要があります(スペースで分割し、最後の部分(タイムゾーン部分)を保持して、に渡すことができます)java.util.TimeZone.getTimeZone()接頭辞GMT)。または、タイプがタイムゾーン情報を追跡するJodaTime
使用することもできます。何かのようなもの: DateTime

DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss Z");

DateTime dt = fmt.parseDateTime(dateHeader);
System.out.println("x = " + fmt.print(dt));
System.out.println("Timezone = " + dt.getZone().toTimeZone().getDisplayName());
于 2012-04-11T13:06:13.920 に答える