Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring mvc 从Spring 4.0中的请求获取时区信息_Spring Mvc_Grails_Timezone - Fatal编程技术网

Spring mvc 从Spring 4.0中的请求获取时区信息

Spring mvc 从Spring 4.0中的请求获取时区信息,spring-mvc,grails,timezone,Spring Mvc,Grails,Timezone,在web请求对象中有一个获取时区信息的新特性。请参见中的第16.9.1节 但我无法解决如何从请求中获取时区信息,或者应该使用哪种方法获取时区信息 在查看并遵循源代码之后,我尝试手动打印它 println WebUtils.getSessionAttribute(request, SessionLocaleResolver.class.getName() + ".TIME_ZONE") 有什么帮助吗?只需添加一个时区类型的方法参数即可获得它 @RequestMapping public Stri

在web请求对象中有一个获取时区信息的新特性。请参见中的第16.9.1节

但我无法解决如何从请求中获取时区信息,或者应该使用哪种方法获取时区信息

在查看并遵循源代码之后,我尝试手动打印它

println WebUtils.getSessionAttribute(request, SessionLocaleResolver.class.getName() + ".TIME_ZONE")

有什么帮助吗?

只需添加一个时区类型的方法参数即可获得它

@RequestMapping
public String foo(TimeZone timezone) { ... }
应该这样做

如果您真的想自己做,请使用
RequestContextUtils.getTimeZone(request)
方法

@RequestMapping
public String foo(HttpServletRequest request) {
    TimeZone timezone = RequestContextUtils.getTimeZone(request);
    ...
}

我仔细研究了一下,其中一个问题是没有默认的
时区设置,这似乎是一个疏忽
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参考文档中没有太多关于使用时区的文档;事实上,在网站的评论中有更多的信息

Grails覆盖了默认的
LocaleResolver
实现
AcceptHeaderLocaleResolver
(它不支持
时区
),而是配置一个
会话LocaleResolver
。这将首先在会话中查找区域设置,然后查找解析程序上设置的默认值(默认为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) { ... }

它工作得很好。

谢谢Denium的回复。使用您的解决方案,我得到的是空值,所以我需要配置其他内容吗?支持取决于
TimeZoneAwareLocaleContext
如何设置/配置,我还不清楚。但基本上,它使用Spring使用的机制来设置/确定
时区。顺便说一句,我希望您已经收到您的机器/服务器的默认时区。您是否在配置中使用了
?不,实际上,我已经为此设置了任何特殊配置。我在一个Grails应用程序中使用它。啊,我错过了这一部分。您得到的
null
这一事实让我相信使用的是旧的注释驱动的片段,而不是新的片段。更新的不应该返回null(当用作方法参数时),但如果找不到其他时区,则为您提供默认值。好的,我将尝试该解决方案。感谢Burt花时间。以前对于基于Grails的旧项目,我们使用基于javascript的方法进行ajax调用,为当前用户设置时区。我认为最新版本支持自动获取时区。但根据您的描述,目前实际上无法直接从请求中获取时区。