Я знаю, что это старый вопрос, но я думаю, что он также вневременной ... по крайней мере, я сталкивался с ним довольно часто в последнее время ... поэтому я думал, что внесу свое решение.
Во-первых, я использую Grails 2.5.1 и PostgreSQL 9.4 в качестве бэкэнда.
Во-вторых, поля даты в Groovy / Grails хранятся как timestamp without time zone
в PostgreSQL. Поэтому мне кажется, что первый ответ выше не совсем корректен - дата не сохраняется в UTC. Это наблюдение заставило меня задуматься ... в духе "хорошо, если база данных не знает, что такое часовой пояс, кто знает"? И первым ответом, который пришёл на ум, было «возможно, это весна».
В-третьих, специфика моей проблемы в том, что у меня много дат, которые я загружал в базу данных с помощью BootStrap.groovy
и new ThisClass().save()
. И поскольку это были даты, а не даты + время, все они выглядят как 2005-11-03 00:00:00
как метки времени PostgreSQL (без часовых поясов).
В-четвертых, то, что действительно понизило пенни, было, когда я отредактировал один из моих GSP, чтобы включить часовой пояс в строку формата даты, которая отображалась как PST (где находится мой сервер); и когда я включил timeZone="Asia/Kolkata"
в g:formatDate
соответствующего поля, время увеличилось на 12:30. Совершенно очевидно, что мой сервер работал в PST8PDT, и, поскольку это был не PostgreSQL, я вернулся в Spring как потенциальное место для перемен.
В-пятых, после прочтения нескольких комментариев об установке языкового стандарта в grails-app/conf/spring/resources.groovy
Я решил попробовать установить там языковой стандарт и часовой пояс, согласно:
// Place your Spring DSL code here
beans = {
// from http://stackoverflow.com/questions/1569446/grails-how-to-change-the-current-locale
localeResolver(org.springframework.web.servlet.i18n.SessionLocaleResolver) {
defaultLocale = new Locale("en","IN")
java.util.Locale.setDefault(defaultLocale)
println "configure spring/resources.groovy defaultLocale $defaultLocale"
defaultTimeZone = TimeZone.getTimeZone("Asia/Kolkata")
java.util.TimeZone.setDefault(defaultTimeZone)
println "configure spring/resources.groovy defaultTimeZone $defaultTimeZone"
}
}
Я также использовал g:format timezone="Asia/Kolkata" format="dd MMM, yyyy a z"
для всех своих полей даты. И это, по-видимому, интерпретирует все данные в полях PostgreSQL timestamp
в правильном часовом поясе и в ожидаемый час (т. Е. В час, который был введен), даже если даты были впервые введены «в неправильном часовом поясе».
Шестое, g:datePicker
- Я прочитал несколько постов о том, как сделать этот «чувствительный часовой пояс», но я обнаружил, что его даты интерпретируются как часовой пояс, используемый Spring, и поэтому в моем случае это именно то, что я необходимость. И наоборот, если кто-то хочет ввести даты в своей локали и сделать так, чтобы Spring конвертировал их на лету в часовой пояс сервера, я думаю, это потребует дополнительных усилий.
Лично я думаю, что было бы здорово, если бы g:datePicker
принял timeZone
в качестве параметра и использовал его так же, как g:formatDate
.