Как получить часовой пояс клиента в java из HttpServletRequest?

Когда сервер и клиент находятся в разных часовых поясах, могу ли я получить часовую зону клиента в java с помощью HttpServletRequest?

Я пытаюсь создать экземпляр "Calender", используя клиентский "Locale", как это,

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

Но это дает мне только часовой пояс сервера.

Является ли этот метод неправильным? Есть ли другой способ получить часовой пояс клиента на сервере?

Ответ 1

К сожалению, информация о часовом поясе не передается в HTTP request.

Но для этого есть работа.

Отметьте this ответ и this один. это может помочь вам.

Ответ 2

есть два способа получить часовой пояс браузера от объекта запроса.

  • когда вы делаете запрос из браузера, добавьте параметр для запроса объекта с помощью javascript. Команда ниже предоставляет часовой пояс браузера:

    Intl.DateTimeFormat().resolvedOptions().timeZone
    

с помощью этой команды вы получите строку, представляющую пример часовой пояс "Pacific/Fakaofo, Pacific/Honolulu", вы можете получить этот часовой пояс из объекта запроса на стороне сервера, используя

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

передать эту строку в Timezone.getTimeZone(timezoneStr); вернет объект часовой пояс для времени браузера

  1. Другой способ сделать это - получить zoneOffset из сеанса запроса. Сессия содержит значение zoneOffset в целочисленной форме, с которой вам нужно получить время GMT. ниже - образец:

    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);

использовать любой из этих методов для получения часового пояса и конвертировать ваш объект календаря в определенный часовой пояс.

из обоих методов секундам dosen't требуется какой-либо код на стороне клиента, но большая проверка на стороне сервера, а первый подход требует небольших изменений на стороне клиента и небольших изменений на стороне сервера. Это зависит от вас, что вы предпочитаете.