5

这是我的代码:

@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

为什么我得到的是服务器时间而不是客户端时间?

4

3 回答 3

5

无论您的客户端在哪里,您的代码都会在服务器上执行。在服务器上,您将为该机器设置时区,用于计算时间。当您调用calendar.getTime()此时区时,将使用该时区。

如果您想要客户端时区,则需要发送它并使用SimpleDateFormat将服务器时间转换为客户端时区。

于 2012-11-30T22:55:06.990 回答
3

这段代码是正确的:

Calendar calendar = new GregorianCalendar(request.getLocale());

它基本上创建了一个Calendar in a的实例:

客户端将根据 Accept-Language 标头接受内容的首选语言环境

您的错误是转换CalendarDate此处:

calendar.getTime()

java.util.Date类与时区无关,并且始终其默认toString()实现始终使用系统(您的服务器)时区。如果要在客户端的时区中格式化当前服务器时间,请使用以下代码片段:

DateFormat df = DateFormat.getDateTimeInstance(
                  DateFormat.LONG, 
                  DateFormat.LONG, 
                  request.getLocale()
  );

df.format(new Date());

最后一点:这在使用客户端时区的服务器上显示时间。这不是浏览器(操作系统)中设置的客户端时间。为了弄清楚客户端上的时区是什么,您需要在 HTTP 请求中显式发送客户端的当前时间。

于 2012-11-30T22:59:48.213 回答
2

我建议保留控制器代码以返回 UTC 时间。然后在视图层或(更好)在客户端浏览器上执行的 javascript 代码中转换为客户端时间。

于 2012-12-01T01:17:48.423 回答