我看着這一點,一個問題是,沒有一個默認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。
謝謝Denium回覆。使用你的解決方案,我得到空值,所以我需要配置別的東西? –
支持取決於'TimeZoneAwareLocaleContext'如何設置/配置,我不清楚(還)。但基本上它使用了Spring用來設置/確定'TimeZone'的機制。我會順帶說一句,你會收到你的機器/服務器的默認時區。你在配置中使用了 嗎? –
其實,我已經爲此設置了任何特殊配置。我在Grails應用程序中使用它。 –