5

これが私のコードです:

@RequestMapping(value="/test", method=RequestMethod.GET)
public @ResponseBody String test(HttpServletRequest request) {
    Calendar calendar = new GregorianCalendar(request.getLocale());
    String currentTime = calendar.getTime().toString();
    return"Current Time: " + currentTime;
}

これは今回私に見せています:

Current Time: Fri Nov 30 22:45:42 UTC 2012

私は中部時間帯にいるので、次のように表示されるはずです。

Current Time: Fri Nov 30 14:45:42 CST 2012

クライアント時間ではなくサーバー時間を取得するのはなぜですか?

4

3 に答える 3

5

クライアントがどこにあるかに関係なく、コードはサーバー上で実行されます。サーバーでは、時間の計算に使用されるそのマシンのタイムゾーンを設定します。calendar.getTime()このタイムゾーンを呼び出すと、使用されます。

クライアントのタイムゾーンが必要な場合は、それを送信し、SimpleDateFormatを使用してサーバー時間をクライアントのタイムゾーンに変換する必要があります。

于 2012-11-30T22:55:06.990 に答える
3

このコードは正しいです:

Calendar calendar = new GregorianCalendar(request.getLocale());

基本的に のインスタンスを作成しCalendar ます:

Accept-Language ヘッダーに基づいて、クライアントがコンテンツを受け入れる優先ロケール

あなたの間違いは、ここに変換するCalendarことDateです:

calendar.getTime()

java.util.Dateクラスはタイムゾーンに依存せず、常にデフォルトのtoString()実装は常にシステム (サーバー) のタイムゾーンを使用します。クライアントのタイム ゾーンで現在のサーバー時刻をフォーマットする場合は、次のコード スニペットを使用します。

DateFormat df = DateFormat.getDateTimeInstance(
                  DateFormat.LONG, 
                  DateFormat.LONG, 
                  request.getLocale()
  );

df.format(new Date());

最後に 1 つ: クライアントのタイム ゾーンを使用したサーバーでのこの表示時間。ブラウザ (オペレーティング システム) で設定されたクライアント時間ではありません。クライアントのタイムゾーンを把握するには、クライアントの現在の時刻を HTTP リクエストで明示的に送信する必要があります。

于 2012-11-30T22:59:48.213 に答える
2

UTC 時刻を返すようにコントローラー コードを残すことをお勧めします。次に、ビュー レイヤーまたは (なお良い) クライアント ブラウザーで実行される JavaScript コードのいずれかで、クライアント時間への変換を行います。

于 2012-12-01T01:17:48.423 に答える