これは古い質問であることは知っていますが、かなり時代を超越したものでもあると思います...少なくとも、最近かなりの回数遭遇しました...だから私は自分の解決策に貢献すると思いました.
まず、Grails 2.5.1 と PostgreSQL 9.4 をバックエンドとして使用しています。
次に、Groovy/Grails の Date フィールドはtimestamp without time zone
PostgreSQL と同じように保存されます。したがって、上記の最初の答えは実際には完全には正しくないように思えます-日付はUTCで保存されていません。この観察により、「データベースがタイムゾーンが何であるかを知らない場合、誰が知っているのか」という行に沿って考えさせられました。そして、最初に浮かんだ答えは「春かもしれない」でした。
BootStrap.groovy
第三に、私の問題の詳細は、 と を介してデータベースにブートストラップした日付がたくさんあることですnew ThisClass().save()
。これらは日付と時刻ではなく日付であるため、すべて2005-11-03 00:00:00
PostgreSQL のタイムスタンプ (タイムゾーンなし) のように見えます。
4 つ目は、GSP の 1 つを編集して、日付形式の文字列にタイムゾーンを含めるようにしたときです。これは PST (サーバーの場所) として表示されました。問題のフィールドを含めるtimeZone="Asia/Kolkata"
とg:formatDate
、時間は 12 時 30 分進みました。私のサーバーは明らかに PST8PDT で実行されていましたが、それは PostgreSQL ではなかったので、物事を変える可能性のある場所として Spring に戻ってきました。
第5に、ロケールの設定に関するいくつかのコメントを読んだ後、次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"
また、すべての日付フィールドにも使用しました。timestamp
そして、日付が最初に「間違ったタイムゾーンで」入力されたにもかかわらず、PostgreSQL フィールドのすべてのデータが正しいタイムゾーンと予想される時間 (つまり、入力された時間) で解釈されるようです。
6番目に、g:datePicker
この「タイムゾーンを区別する」ことに関する多くの投稿を読みましたが、その日付はSpringで使用されるタイムゾーンのように解釈されることがわかったので、私の場合、これはまさに私が必要とするものです. 逆に、誰かが自分のロケールで日付を入力し、Spring にその日付をサーバーのタイム ゾーンにその場で変換させたい場合は、追加の作業が必要になると思います。
g:datePicker
個人的には、パラメーターとして受け入れられtimeZone
て、同じように使用されると、本当にクールだと思いますg:formatDate
.