如何从HttpServletRequest获取Java中的客户端时区?

2022-09-03 07:37:29

当服务器和客户端位于不同的时区时,我可以使用HttpServletRequest在java中获取客户端的时区吗?

我正在尝试使用客户端的“Locale”创建“日历”的实例,如下所示,

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

但这只给了我服务器的时区。

这种方法是错误的吗?有没有其他方法可以在服务器中获取客户端的时区?


答案 1

遗憾的是,时区信息不会传入 。HTTP request

但是这种情况有一个解决方法。

检查这个答案和这个答案。它可能会帮助你。


答案 2

有两种方法可以从请求对象获取浏览器的时区。

  1. 当您从浏览器发出请求时,使用javascript将参数添加到请求对象。以下命令给出了浏览器的时区:

    Intl.DateTimeFormat().resolvedOptions().timeZone
    

使用此命令,您将获得一个表示时区示例“太平洋/法考福,太平洋/檀香山”的字符串,您可以使用

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

将此字符串传递给 Timezone.getTimeZone(timezoneStr);将返回浏览器时间的时区对象

  1. 另一种方法是从请求会话中获取区域偏移。会话包含整数形式的 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);

使用这些方法中的任何一个来获取时区并将日历对象转换为定义的时区。

在这两种方法中,秒不需要任何客户端代码,但在服务器端进行大量验证,第一种方法需要在客户端进行小的更改,在服务器端进行小的更改。这取决于你喜欢什么。


推荐