完成更改应用程序时区的最佳方式是什么?我看到它的方式必须发生以下事件:grails/mysql时区更改
- 服务器TZ是由系统管理员更改,必须重新启动
- 的MySQL。
- 数据库中的每个基于时间的列都必须使用convert_tz或同等值更新所有值。因此,必须编写mysql脚本或者为每个类加载每行的grails脚本,以更新所有时间字段。
很显然,在发生这种情况时应该关闭服务器,备份必须在发生错误的地方。
有没有更好/更简单的方法来做到这一点?
完成更改应用程序时区的最佳方式是什么?我看到它的方式必须发生以下事件:grails/mysql时区更改
很显然,在发生这种情况时应该关闭服务器,备份必须在发生错误的地方。
有没有更好/更简单的方法来做到这一点?
Java在使用日期时不使用时区;它将所有内容存储为UTC,并且仅在显示日期时使用时区。有关java日期/时间的讨论,请参阅以下链接。 http://www.odi.ch/prog/design/datetime.php
我们不得不使用GORM和使用groovy.sql.Sql(更快的数据导入)之间的时间差的问题。
GORM使用我们在Bootstrap中设置的grails配置时区(UTC),但groovy sql使用默认系统时区(GMT)。
该问题已通过在$ JAVA_OPTS中设置时区来解决,但您可以将切换添加到grails opts或run-app命令。
grails -Duser.timezone=UTC run-app
我知道这是一个老问题,但我认为这也是相当永恒......至少,我已经在它最近一个公平的次数跌跌撞撞......所以我想我会贡献我的解。
首先,我使用Grails 2.5.1和PostgreSQL 9.4作为后端。
其次,Groovy/Grails中的日期字段在PostgreSQL中存储为timestamp without time zone
。所以在我看来,上面的第一个答案实际上并不完全正确 - 日期不以UTC存储。这个观察让我想到了......“如果数据库不知道时区是什么,谁会这样做”?而想到的第一个答案是“也许它是春天”。
第三,我的问题的细节是我有很多日期,我通过BootStrap.groovy
和new 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
相同的方式使用它,那我个人认为它会很酷。