5

我有一个带有以下代码的 Grails 应用程序:

Date now = Calendar.getInstance().getTime() //Also tried new Date()
println "now: " + now

当我这样做时,我得到now: Thu Aug 18 12:47:09 CDT 2011. 我需要日期为 GMT,而不是本地时间,因为我需要将 GMT 时间存储在数据库中。我可以使用 simpleDateFormat 对象打印出 GMT 时间,但我需要将其实际存储为 GMT。

问题:如何使用 GMT 将 Date 对象转换为 Date 对象?

4

8 回答 8

5

这突出了为什么 Java 在时间上很糟糕。之前的帖子都已关闭,但我们需要非常小心地获取 GMT 中的当前时间,以及获取 CDT 中的当前时间并称其为 GMT。

TimeZone reference = TimeZone.getTimeZone("GMT");
Calendar myCal = Calendar.getInstance(reference);

这是 GMT 的当前时间,带有 GMT 的时区上下文。

要转换为保持区域完整的 Date 对象,您需要调用:

TimeZone.setDefault(reference);

此设置将与您当前的 JVM 一样长。现在调用 get Time 应该会产生所需的结果。

myCal.getTime();
于 2011-08-18T18:30:42.400 回答
2

好吧,如果你真的想要 GMT 时间,你需要把它作为 GMT 时间(@jpredham 是对的。向你致敬!编辑我的帖子以反映这一点)

所以请执行以下操作

//this option uses TimeZone
TimeZone gmtTimeZone = TimeZone.getTimeZone("GMT");
TimeZone.setDefault(gmtTimeZone);
Calendar calendar = Calender.getInstance(gmtTimeZone);

Date myDate = calendar.getTime();
于 2011-08-18T18:04:41.017 回答
1

试试这个:

println Calendar.getInstance(TimeZone.getTimeZone('GMT')).format('HH:mm:ss')

请注意,当您转换为日期时,您会丢失时区信息。当 Java/Groovy 格式化您的日期以进行打印时,它会自动将其格式化为您的本地时区。不用担心,您的日期没有与之关联的时区。您可以在显示时重新添加正确的时区,如下所示:

Date now = Calendar.getInstance(TimeZone.getTimeZone('GMT')).time
def formatter = new java.text.SimpleDateFormat('HH:mm:ss')
formatter.timeZone = TimeZone.getTimeZone('GMT')
println formatter.format(now)
于 2011-08-18T18:10:55.497 回答
0

在内部,日历对象以 UTC(GMT 的现代名称)存储时间。 getTimeInMillis()返回一个 UTC 值,并且可能是您想要存储的值。

于 2011-08-18T17:57:33.170 回答
0

您应该尝试 GregorianCalendar#setTimeZone(TimeZone timeZone)。

于 2011-08-18T17:58:43.357 回答
0

使用 System.currentTimeMillis() 不仅比使用 Calendar 或 Date 快得多,而且它始终为您提供 GMT 时间。如果您想显示这个时间,您可以使用 SimpleDateFormat,将时区设置为您想要的任何时间。

于 2011-08-18T18:03:59.697 回答
0

您将日期时间对象与其字符串表示混淆了。Java 中的所有常见日期时间库(Java 8 中的 java.util.Date、Joda-Time、java.time)在内部跟踪自 1970 年第一刻(UTC)以来的小数秒数,同时忽略闰秒。因此,在所有三个库中,日期时间在内部始终为 UTC/GMT。

因此,您关于如何在 GMT(UTC)中将 Date 对象转换为 Date 对象的问题毫无意义。

两个更好的库(Joda-Time 和 java.time)还跟踪日期时间对象内的时区。臭名昭著的麻烦 java.util.Date 没有分配时区,但在toString调用它的方法时会混淆地应用 JVM 的当前默认时区。

郑重声明,Joda-Time 对此做了简短的处理。

DateTime nowUtc = DateTime.now( DateTimeZone.UTC );

调用该对象的 toString 方法会在祖鲁 (UTC) 时间生成 ISO 8601 格式的字符串。

在 StackOverflow 中搜索“Joda”和“formatter”,以找到许多适应其他时区的示例。

于 2014-05-26T06:58:08.260 回答
0
于 2018-02-16T23:28:51.603 回答