在 Web 请求对象中获取时区信息的新功能。请参阅 http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/mvc.html#mvc-timezone 中的 16.9.1 部分
但是我无法解决如何从请求中获取时区信息或应该使用哪种方法来获取时区信息?
在 https://github.com/spring-projects/spring-framework/blob/v4.0.7.RELEASE/spring-webmvc/src/main/java/org/springframework/web/servlet/support/RequestContext.java#L242 查看并遵循源代码后,我尝试手动打印它
println WebUtils.getSessionAttribute(request, SessionLocaleResolver.class.getName() + ".TIME_ZONE")
有什么帮助吗?
只需添加类型为 TimeZone
的方法参数即可获取它。
@RequestMapping
public String foo(TimeZone timezone) { ... }
这应该可以做到。
如果您真的想自己做,请使用RequestContextUtils.getTimeZone(request)
方法。
@RequestMapping
public String foo(HttpServletRequest request) {
TimeZone timezone = RequestContextUtils.getTimeZone(request);
...
}
我对此进行了一些研究,一个问题是没有默认的TimeZone
集,这似乎是一个疏忽; 如果没有其他可用,RequestContextUtils.getTimeZone(request)
应返回服务器的时区。
这很容易修复;在 BootStrap.groovy
中为 "localeResolver" Bean 添加依赖注入,并在解析器中添加一些代码以设置默认时区:
class BootStrap {
def localeResolver
def init = {
if (!localeResolver.defaultTimeZone) {
localeResolver.defaultTimeZone = TimeZone.getDefault()
// or hard-code to a known instance, e.g. TimeZone.getTimeZone('America/New_York')
}
}
}
在 Spring 参考文档中没有太多关于使用 TimeZone
的文档;实际上,在 2005 年原始功能请求的注释中提供了更多信息。
Grails覆盖AcceptHeaderLocaleResolver
的默认LocaleResolver
实现(不支持TimeZone
),并改为配置SessionLocaleResolver
。它首先在会话中查找语言环境,然后查找解析器上设置的默认值(默认为 null - 它不是由 Grails 初始化的),最后它调用 request.getLocale()
,检查Accept-Language
标头。这是通常设置的,因为具有本地化文本是一件好事。此外,还配置了一个LocaleChangeInterceptor
,该查找"lang"参数来支持更改Locale
。但是,没有从客户端传递时区信息的约定。
在我看来,时区 ID 就像您在用户注册期间会要求的东西,并与其他配置文件信息一起存储在数据库中。然后,当他们进行身份验证时,您可以使用存储的值(如果存在)并将其设置在LocaleResolver
将找到它的会话中,例如
import org.springframework.web.servlet.i18n.SessionLocaleResolver
...
session[SessionLocaleResolver.TIME_ZONE_SESSION_ATTRIBUTE_NAME] =
TimeZone.getTimeZone(user.timeZoneId)
可以在JavaScript中获取用户的本地时间和时区,并通过Ajax将其发送到服务器。有关一些示例,请参阅此答案中的链接。
对于 Spring Boot 2.x.x
@RequestMapping
public String foo(TimeZone timezone) { ... }
它工作完美。