有两种方法可以从请求对象获取浏览器的时区。
-
当您从浏览器发出请求时,使用javascript将参数添加到请求对象。以下命令给出了浏览器的时区:
Intl.DateTimeFormat().resolvedOptions().timeZone
使用此命令,您将获得一个表示时区示例“太平洋/法考福,太平洋/檀香山”的字符串,您可以使用
String timezoneStr = request.getParameter("your_parameter_name");
将此字符串传递给 Timezone.getTimeZone(timezoneStr);将返回浏览器时间的时区对象
-
另一种方法是从请求会话中获取区域偏移。会话包含整数形式的 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);
使用这些方法中的任何一个来获取时区并将日历对象转换为定义的时区。
在这两种方法中,秒不需要任何客户端代码,但在服务器端进行大量验证,第一种方法需要在客户端进行小的更改,在服务器端进行小的更改。这取决于你喜欢什么。