java - Grails 中的时区转换导致错误的日期

标签 java grails calendar timezone

我即将在 Grails (Java) 中处理时区问题。这里使用 Java 7 和 Grails 2.3.7。

我有一个 WebApp,其中为每个用户分配了一个 timeZoneID。如果用户输入一个日期,它只包含日、月和年。我想自动设置时间。

用户输入的日期(例如 01.10.2018,德语格式)应以 UTC 格式保存在数据库(MySQL)中。 当日期显示给用户时,它会根据用户的时区进行格式化。

许多 timeZoneIDs 与我的代码(Europe/Berlin、Hont_Kong 等)配合得很好,但 America/New_York 却不能,我不明白为什么。

解析并保存日期的代码如下:

//endDate is 31.10.2018
def format = messageService.getMessage(code: 'default.date.short.format')

//--> dd.MM.yyyy for DE and MM/dd/yy for EN
println("Use format: " + format)

SimpleDateFormat sdf = new SimpleDateFormat(format);

//set timezone (America/New_York)
sdf.setTimeZone(TimeZone.getTimeZone(user.timeZoneID))

//parse endDate
Date parsedEndDate = sdf.parse(endDate)

//create a calendar instance (e.g. America/New_York)
Calendar calendarEnd = Calendar.getInstance(TimeZone.getTimeZone(user.timeZoneID));

//set time
calendarEnd.setTime(parsedEndDate);

//set hour/minute automatically
calendarEnd.set(Calendar.HOUR_OF_DAY, 23)
calendarEnd.set(Calendar.MINUTE, 59)

//at this point it should be 31.10.2018, 23:59 (german format, timezone America/New_York)

//Convert to UTC before saving date in DB (MySQL)
calendarEnd.setTimeZone(TimeZone.getTimeZone('UTC'))

//save the date
def obj = new Foo(date:calendarEnd).save(flush:true)

我的 View (gsp) 中显示日期的代码如下:

<g:formatDate
        timeZone="${user.timeZoneID}"
        date="${fooInstance?.calendarEnd}"
        format="${message(code: 'default.date.format', default: 'MM/dd/yyyy, hh:mm a')}"/>

在数据库中我得到 2018-11-01 00:59:00 在我看来 (GSP),结果是 2018 年 10 月 31 日 19:59,而不是 2018 年 10 月 31 日 23:59

非常感谢您的帮助。

最佳答案

问题出在转换步骤:

//Convert to UTC before saving date in DB (MySQL)
calendarEnd.setTimeZone(TimeZone.getTimeZone('UTC'))

因为您只是更改时区,所以它使用给定的时间和日期,就好像它是 UTC 时区一样。

Java 1.7 及之前的版本在 Time API 方面有些笨拙,因此很多人使用 Joda Time。

否则你可以使用来自 this question 的建议结果是这样的:

calendarEnd.add(Calendar.MILLISECOND, TimeZone.getTimeZone('UTC').getOffset(parsedEndDate.getTime())

这没有经过测试,可能是错误的,因为偏移计算可能不同

关于java - Grails 中的时区转换导致错误的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52836120/

相关文章:

java - 关于JPanel重绘的问题

postgresql - Grails-Heroku不使用DataSource.groovy中定义的数据库

hibernate - Grails 集成测试数据不能跨越原生 SQL 与 GORM 边界

java - Calendar to Date 问题,期间有 1 年错误

java - 如何更改 Gradle IntelliJ 项目中的依赖关系?

java - 如何使用java将xml文件数据插入mongodb数据库?

java - Eclipse 插件弹出窗口的操作初始可用性

model-view-controller - 从 Grails 中的布局 View 访问模型

ruby-on-rails - 预订系统的Rails gem

java - 对于在静态哈希表上同步的 java.util.Calendar 构造函数,我们可以做些什么?