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

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

我正在尝试使用客户端的’Locale’创建一个’Calender’实例,

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

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

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

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

但是有一个解决这个问题的方法。

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

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

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

     Intl.DateTimeFormat().resolvedOptions().timeZone 

使用此命令,您将获得一个表示时区示例“Pacific / Fakaofo,Pacific / Honolulu”的字符串,您可以使用服务器端的请求对象获取此时区

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

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

  1. 另一种方法是从请求会话中获取zoneOffset。 Session包含整数forms的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); 

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

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