web-dev-qa-db-ja.com

JavaでHttpServletRequestからクライアントのタイムゾーンを取得する方法は?

サーバーとクライアントが異なるタイムゾーンにある場合、クライアントのタイムゾーンをHttpServletRequestを使用してJavaで取得できますか?

私はこのようなクライアントの「ロケール」を使用して「カレンダー」のインスタンスを作成しようとしています、

Calendar calendar = Calendar.getInstance(request.getLocale());
TimeZone clientTimeZone = calendar.getTimeZone();

しかし、これは私にサーバーのタイムゾーンのみを与えています。

この方法は間違っていますか?サーバーでクライアントのタイムゾーンを取得する他の方法はありますか?

15
Noor Khan

残念ながら、タイムゾーン情報はHTTP requestで渡されません。

しかし、このケースには回避策があります。

this 回答と this 回答を確認してください。それはあなたを助けるかもしれません。

8
Salah

リクエストオブジェクトからブラウザのタイムゾーンを取得する方法は2つあります。

  1. ブラウザからリクエストを行う場合は、JavaScriptを使用してリクエストオブジェクトにパラメータを追加します。以下のコマンドは、ブラウザーのタイムゾーンを示します。

    Intl.DateTimeFormat().resolvedOptions().timeZone
    

このコマンドを使用すると、タイムゾーンの例「Pacific/Fakaofo、Pacific/Honolulu」を表す文字列を取得できます。このタイムゾーンは、サーバー側のリクエストオブジェクトから取得できます。

String timezoneStr = request.getParameter("your_parameter_name");

この文字列をTimezone.getTimeZone(timezoneStr);に渡します。ブラウザの時間のタイムゾーンオブジェクトを返します

  1. これを行う別の方法は、要求セッションからzoneOffsetを取得することです。セッションには、GMT時刻を取得するために必要な整数形式のzoneOffset値が含まれています。以下はサンプルです:

    public static String getGMTSignedZone(HttpServletRequest request)
    {
    String zoneOffset;
    HttpSession session = request.getSession();
    zoneOffset = (String)session.getAttribute("timezone");
    if(zoneOffset != null && !zoneOffset.equals(""))
    {
        Integer zMinutes = Integer.valueOf(zoneOffset);
        String sign = (zMinutes < 0) ? "+" : "-";
        String hourString;
        String minString;
        if(zMinutes < 0)
        {
            zMinutes = zMinutes*(-1);
        }
    
        // hours 0 to 23
        int hours = zMinutes/60;
        if(hours > 23)
        {
            hours = hours/24;
        }
        if(hours < 10)
        {
            hourString = "0" + hours;
        }
        else
        {
            hourString = "" + hours;
        }
        //minute conversion
        int minutes = zMinutes - (hours*60);
        if(minutes < 10)
        {
            minString = "0" + minutes;
        }
        else
        {
            minString = "" + minutes;
        }
        return ("GMT" + sign + hourString + minString);
    }
    return zoneOffset;
    }
    

上記のリターンは、以下のコードを使用して簡単にタイムゾーンに変換できます。

    StringBuffer buffer = new StringBuffer("");
    int absOffset = Math.abs(offset);
    int hrs = absOffset/60;
    int mins = absOffset%60;
    buffer.append("GMT").append(offset > 0 ? "-" : "+").append(hrs < 10 ? "0" : "").append(hrs).append(":").append(mins < 10 ? "0" : "").append(mins);
    String tzID = buffer.toString();
    TimeZone tz = TimeZone.getTimeZone(tzID);

これらのメソッドのいずれかを使用してタイムゾーンを取得し、カレンダーオブジェクトを定義されたタイムゾーンに変換します。

どちらの方法でも、秒数にはクライアント側のコードは必要ありませんが、サーバー側で多くの検証が必要です。最初のアプローチでは、クライアント側で小さな変更とサーバー側で小さな変更が必要です。好みはあなた次第です。

0
Kushagra Misra