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

时间:2014-03-18 12:28:12

标签: java servlets timezone locale

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

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

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

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

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

2 个答案:

答案 0 :(得分:7)

不幸的是,时区信息未在HTTP request传递。

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

检查this回答和this一个。它可能对你有所帮助。

答案 1 :(得分:0)

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

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

    Intl.DateTimeFormat().resolvedOptions().timeZone
    
  2. 使用此命令,您将获得一个表示时区示例的字符串" 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;
      }
      
    2. 使用以下代码可以很容易地将上面的返回转换为时区:

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

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

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