希望有人可以帮助解决这个非常烦人的情况,我发现自己与Grails&日期和时间时区作为我的理解并不完全。
为了描述这种情况,首先我在英国,该应用程序所在的服务器位于美国(CST)
用户登录我的应用程序,我有一个字段,其中包含其时区,其唯一目的是格式化与其位置相符的日期。
当应用程序启动时,我强制执行UTC的默认时区,并且我还在应用程序的其他位置使用了一些Joda日期,因此我将Joda DateTimeZone也设置为UTC。但我只把Joda用于固定日期,这些日期在呈现时不应该改变。
所以在Bootstrap中我有TimeZone.setDefault(TimeZone.getTimeZone(“UTC”))
现在问题是,对于某些我希望在用户交互时记录的表,因此有一个名为“lastModified”的日期字段,并且当记录更新时,我只需将其设置为新的日期()
我正在使用ajax调用来呈现数据,而不是直接在GSP中显示字段,而是在控制器中对其进行预处理,对于格式化,我创建了一个格式化程序
DateTimeZone dtz = DateTimeZone.forID(user.timeZone)
def DateTimeFormatter tzAwareLongFormatter = DateTimeFormat.forPattern('MM/dd/yyyy HH:mm').withZone(dtz);
我认为这将是完美的,日期将保持UTC,然后作为欧洲/伦敦的用户tz我会看到日期格式正确。
然而,我得到的时间是+7小时
所以就像它在服务器位置存储日期时间一样,即使我在Bootstrap.groovy中设置默认时间。
有什么我应该设置而不必诉诸于更改服务器时间本身吗?
答案 0 :(得分:1)
似乎在bootstrap中设置默认TZ是不够的,我不得不添加
-Duser.timezone=UTC
到JAVA_OPTS,到目前为止,日期显示正确。