【问题标题】:how to get client's time zone in java from HttpServletRequest? [duplicate]java - 如何从HttpServletRequest获取客户端的时区? [复制]
【发布时间】:2014-04-24 03:16:24
【问题描述】:

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

我正在尝试像这样使用客户端的“区域设置”创建一个“日历”实例,

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

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

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

【问题讨论】:

    标签: java servlets timezone locale


    【解决方案1】:

    很遗憾,HTTP request 中没有传递时区信息。

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

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

    【讨论】:

      【解决方案2】:

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

      1. 当您从浏览器发出请求时,使用 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);
      

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

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

      【讨论】:

      • 我更喜欢第二种解决方案,因为如果避免移动到黑暗的一面(JavaScript :))但不幸的是,在我的情况下,会话似乎不包含“时区”属性:字符串 zoneOffset = (String)session.getAttribute("timezone");给出一个空 zoneOffset,知道为什么吗?
      猜你喜欢
      • 2013-05-24
      • 1970-01-01
      • 2010-12-26
      • 2013-07-05
      • 2015-01-29
      • 2011-10-19
      • 1970-01-01
      • 2017-03-23
      相关资源
      最近更新 更多