Spring应用程序显示服务器时间而不是客户端时间

时间:2012-11-30 22:53:51

标签: java spring datetime

这是我的代码:

@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

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

3 个答案:

答案 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代码。