Joda DateTime到java.sql.Timestamp忽略时区?

时间:2013-10-12 11:35:53

标签: postgresql scala datetime timestamp jodatime

在scala程序中,我从客户端收到特定日期,例如:

2013-10-20T23:59:59.999Z

我真的想在保存到数据库时保留这个日期,而不是转换为本地,所以这一行:

debug("--sql timestamp: " + new Timestamp(reading.timestamp.getMillis()))

打印出来:2013-10-21 02:59:59.999(我在罗马尼亚)。

有什么方法可以忽略时区吗?

2 个答案:

答案 0 :(得分:2)

这是Timestamp.toString()行为。 java.sql.Timestamp扩展了java.util.Date及其使用的toString()方法,特别是super.getHours()according to javadoc,返回在当地时区解释的小时数 - 与您完全一样观察。

但是,内部Timestamp仍保留正确的时间戳值。但是,将其存储到数据库可能存在问题。请参阅this回答。

答案 1 :(得分:2)

2013-10-20T23:59:59.999Z2013-10-21 02:59:59.999实际上是同一时间:2013-10-20T23:59:59.999Z位于UTC time zone (Z),而第二个是相对的,并表示为您的本地时区(UTC +3然后在罗马尼亚)。

在PostgreSQL中,您应该将时间戳存储为数据库中的TIMESTAMP WITH TIME ZONETIMESTAMPTZ)来处理此问题。您将始终能够在您选择的时区(例如UTC)中将其打印出来。 (您可能对this recent question感兴趣了解存储类型的重要性。)

如果您想再次打印UTC / Z时区的时间戳,new DateTime(millis, DateTimeZone.UTC)应该有帮助(使用Joda Time)。