当服务器和客户端在不同的时区,我可以使用HttpServletRequest在java中获得客户端的时区吗?
我正在尝试使用客户端的'区域设置'创建'日历'的实例,像这样,
Calendar calendar = Calendar.getInstance(request.getLocale());
TimeZone clientTimeZone = calendar.getTimeZone();
但是这只给了我服务器的时区。
这个方法是错的吗?有没有其他的方法来获得客户端的时区在服务器?
遗憾的是,在HTTP request
中没有传递时区信息。
但是对于这种情况有一个解决办法。
检查this
的答案和this
的答案。
有两种方法可以从请求对象中获取浏览器的时区。
-
当你从浏览器发出请求时,使用javascript添加一个参数到请求对象。下面的命令给出浏览器的时区:
Intl.DateTimeFormat().resolvedOptions().timeZone
使用这个命令,你将得到一个代表时区的字符串,例如"Pacific/Fakaofo,Pacific/Honolulu",你可以使用
从服务器端的请求对象中获取这个时区String timezoneStr = request.getParameter("your_parameter_name");
传递这个字符串给Timezone.getTimeZone(timezoneStr);将返回浏览器时间的时区对象
另一种方法是从请求会话中获取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);
使用这些方法中的任何一个来获取时区并将日历对象转换为定义的时区。
在这两种方法中,第二种方法不需要任何客户端代码,但需要在服务器端进行大量验证,而第一种方法需要在客户端和服务器端进行少量更改。你喜欢什么由你决定。