2014-12-29 64 views
4

在Web請求對象中有獲取時區信息的新功能。見012.http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/mvc.html#mvc-timezone從Spring 4.0的請求中獲取時區信息

但我無法解決,我們如何從請求獲取時區信息或我應該使用哪種方法來獲取時區信息?

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") 

任何幫助嗎?

回答

8

只需添加類型爲TimeZone的方法參數即可獲取它。

@RequestMapping 
public String foo(TimeZone timezone) { ... } 

這應該這樣做。

如果您真的想自己動手,請使用RequestContextUtils.getTimeZone(request)方法。

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

謝謝Denium回覆。使用你的解決方案,我得到空值,所以我需要配置別的東西? –

+0

支持取決於'TimeZoneAwareLocaleContext'如何設置/配置,我不清楚(還)。但基本上它使用了Spring用來設置/確定'TimeZone'的機制。我會順帶說一句,你會收到你的機器/服務器的默認時區。你在配置中使用了嗎? –

+0

其實,我已經爲此設置了任何特殊配置。我在Grails應用程序中使用它。 –

3

我看着這一點,一個問題是,沒有一個默認TimeZone集,這似乎是一種監督;如果沒有其他可用的話,RequestContextUtils.getTimeZone(request)應該返回服務器的時區。

這很容易修復;在BootStrap.groovy添加依賴注入了「的LocaleResolver」豆和一些代碼來設置解析器的默認時區:

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') 
     } 
    } 
} 

沒有太多記載關於與TimeZone S IN Spring參考文檔工作;在original feature request from 2005的評論中實際上有更多的信息。

Grails覆蓋默認的LocaleResolver實施AcceptHeaderLocaleResolver(它不支持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中獲取用戶的本地時間和TimeZone,並通過Ajax將其發送到服務器。有關示例,請參閱links in this answer

+0

謝謝Burt抽出時間。以前對於較老的基於Grails的項目,我們使用基於javascript的方法爲ajax調用爲當前用戶設置時區。我雖然最新版本有自動獲取時區的支持。但根據您的描述,現在實際上沒有辦法直接從請求中獲取時區。 –

相關問題