2010-08-02 84 views
2

完成更改應用程序時區的最佳方式是什麼?我看到它的方式必須發生以下事件:grails/mysql時區更改

  1. 服務器TZ是由系統管理員更改,必須重新啓動
  2. 的MySQL。
  3. 數據庫中的每個基於時間的列都必須使用convert_tz或同等值更新所有值。因此,必須編寫mysql腳本或者爲每個類加載每行的grails腳本,以更新所有時間字段。

很顯然,在發生這種情況時應該關閉服務器,備份必須在發生錯誤的地方。

有沒有更好/更簡單的方法來做到這一點?

回答

3

Java在使用日期時不使用時區;它將所有內容存儲爲UTC,並且僅在顯示日期時使用時區。有關java日期/時間的討論,請參閱以下鏈接。 http://www.odi.ch/prog/design/datetime.php

1

我們不得不使用GORM和使用groovy.sql.Sql(更快的數據導入)之間的時間差的問題。

GORM使用我們在Bootstrap中設置的grails配置時區(UTC),但groovy sql使用默認系統時區(GMT)。

該問題已通過在$ JAVA_OPTS中設置時區來解決,但您可以將切換添加到grails opts或run-app命令。

grails -Duser.timezone=UTC run-app

2

我知道這是一個老問題,但我認爲這也是相當永恆......至少,我已經在它最近一個公平的次數跌跌撞撞......所以我想我會貢獻我的解。

首先,我使用Grails 2.5.1和PostgreSQL 9.4作爲後端。

其次,Groovy/Grails中的日期字段在PostgreSQL中存儲爲timestamp without time zone。所以在我看來,上面的第一個答案實際上並不完全正確 - 日期不以UTC存儲。這個觀察讓我想到了......「如果數據庫不知道時區是什麼,誰會這樣做」?而想到的第一個答案是「也許它是春天」。

第三,我的問題的細節是我有很多日期,我通過BootStrap.groovynew ThisClass().save()引導到數據庫中。因爲這些日期,而不是日期+時間,它們都看起來像2005-11-03 00:00:00作爲PostgreSQL時間戳(沒有時區)。第四,當我編輯我的一個GSP來在日期格式字符串中包含時區時,真正製造便士下降的是什麼,它顯示爲PST(我的服務器在哪裏);當我在該領域的g:formatDate中包括timeZone="Asia/Kolkata"時,時間提前了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相同的方式使用它,那我個人認爲它會很酷。