这是我的代码:
@RequestMapping(value="/test", method=RequestMethod.GET)
public @ResponseBody String test(HttpServletRequest request) {
Calendar calendar = new GregorianCalendar(request.getLocale());
String currentTime = calendar.getTime().toString();
return"Current Time: " + currentTime;
}
这次向我展示:
Current Time: Fri Nov 30 22:45:42 UTC 2012
我在中央时区,所以应该告诉我这个:
Current Time: Fri Nov 30 14:45:42 CST 2012
为什么我得到服务器时间而不是客户端时间?
答案 0 :(得分:5)
您的代码在服务器上执行,无论您的客户在哪里。在服务器上,您将为该计算机设置时区,该时区将用于计算时间。当您致电calendar.getTime()
时,将使用此时区。
如果您需要客户端时区,则需要发送它并使用SimpleDateFormat来将服务器时间转换为客户端时区。
答案 1 :(得分:3)
这段代码是正确的:
Calendar calendar = new GregorianCalendar(request.getLocale());
它基本上创建了Calendar
in a的实例:
客户端将根据Accept-Language标头
接受内容的首选语言环境
您的错误在于将Calendar
转换为Date
:
calendar.getTime()
java.util.Date
类与时区无关,并且其默认toString()
实现始终使用系统(您的服务器)时区。如果要格式化客户端时区中的当前服务器时间,请使用以下代码段:
DateFormat df = DateFormat.getDateTimeInstance(
DateFormat.LONG,
DateFormat.LONG,
request.getLocale()
);
df.format(new Date());
最后一点:使用客户端时区在服务器上显示时间。它不是浏览器(操作系统)中设置的客户端时间。为了弄清楚客户端上的时区是什么,您需要在HTTP请求中显式发送客户端的当前时间。
答案 2 :(得分:2)
我建议保留控制器代码以返回UTC时间。然后在视图层中转换为客户端时间,或者(更好的是)在客户端浏览器上执行的javascript代码。