2

アプリのタイムゾーンを変更する最良の方法は何ですか? 私の見方では、次のことが発生する必要があります。

  1. サーバー TZ はシステム管理者によって変更されます
  2. mysql を再起動する必要があります。
  3. データベース内の毎回ベースの列は、convert_tz または同等のものを使用して、すべての値を更新する必要があります。そのため、mysql スクリプトを作成するか、各クラスのすべての行をロードしてすべての時刻フィールドを更新する grails スクリプトを作成する必要があります。

明らかに、これが発生している間はサーバーを停止する必要があり、エラーが発生した場合に備えてバックアップを作成する必要があります。

これを行うためのより良い/より簡単な方法はありますか?

4

3 に答える 3

3

Dates を使用する場合、Java はタイムゾーンを使用しません。すべてを UTC として保存し、日付を表示するときにタイム ゾーンのみを使用します。Java の日付/時刻の説明については、次のリンクを参照してください。 http://www.odi.ch/prog/design/datetime.php

  • MySQL で Date、Time、または DateTime カラム タイプを使用している場合、タイム ゾーンは関係ありません。
  • TIMESTAMP 列タイプを使用している場合、TIMESTAMP は UTC として保存されますが、値の取得と保存の両方で変換が行われるため、タイム ゾーンが問題になる場合があります。MySQL のタイム ゾーンの動作については、http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html を参照して ください
  • 異なるタイム ゾーンにある複数のサーバー間でオブジェクトを同期することを心配している場合は、さらに複雑になります。これについては、次のスレッドを参照してください。 http://www.pubbs.net/201006/grails/2500-grails-user-how-to-get-gorm-to-store-dates-as-timestamp-in-utc-by-default-without-a- custom-hibernate-mapping-or-joda-time-plu.html
于 2010-08-02T19:13:23.997 に答える
2

これは古い質問であることは知っていますが、かなり時代を超越したものでもあると思います...少なくとも、最近かなりの回数遭遇しました...だから私は自分の解決策に貢献すると思いました.

まず、Grails 2.5.1 と PostgreSQL 9.4 をバックエンドとして使用しています。

次に、Groovy/Grails の Date フィールドはtimestamp without time zonePostgreSQL と同じように保存されます。したがって、上記の最初の答えは実際には完全には正しくないように思えます-日付はUTCで保存されていません。この観察により、「データベースがタイムゾーンが何であるかを知らない場合、誰が知っているのか」という行に沿って考えさせられました。そして、最初に浮かんだ答えは「春かもしれない」でした。

BootStrap.groovy第三に、私の問題の詳細は、 と を介してデータベースにブートストラップした日付がたくさんあることですnew ThisClass().save()。これらは日付と時刻ではなく日付であるため、すべて2005-11-03 00:00:00PostgreSQL のタイムスタンプ (タイムゾーンなし) のように見えます。

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.

于 2016-02-11T21:15:42.013 に答える
1

GORM を使用する場合と groovy.sql.Sql を使用する場合 (データのインポートを高速化するため) の時間差に問題がありました。

GORM は Bootstrap で設定した grails config タイムゾーン (UTC) を使用していましたが、groovy sql はデフォルトのシステム タイムゾーン (GMT) を使用していました。

この問題は、$JAVA_OPTS でタイムゾーンを設定することで解決されましたが、スイッチを grails opts または run-app コマンドに追加することもできます。

grails -Duser.timezone=UTC run-app

于 2012-09-11T08:56:47.340 に答える