使用Postgres的TimeZone将Date转换为TimeStamp

时间:2016-01-19 08:28:04

标签: java spring date time

我有postgresql时间列,类型TIMESTAMP WITH TIME ZONE的样本值类似于1970-01-01 00:00:00+05:30我想比较一个值 Date的值如下:

Date date = new Date(0L);

即。 2016年1月19日星期二13:55:24

所以我用了

Timestamp timeStampDate = new Timestamp(date.getTime());

上面的代码将timeStampDate.getTime()设为0。

如何以上述格式转换它以便可以进行比较,目前比较没有结果。 如何格式化此日期。

我基本上想把“Date is Thu Jan 01 05:30:00 IST 1970”转换成这种格式:“1970-01-01 00:00:00 + 05:30”

1 个答案:

答案 0 :(得分:1)

java.time

如果您的数据库驱动程序支持JDBC 4.2或更高版本,请使用Instant从数据库中获取存储在TIMESTAMP WITH TIME ZONE列中的数据。

Instant instant = myResultSet.getObject( … , Instant.class ) ;

对于较旧的JDBC驱动程序,请使用getTimestamp通过调用ResultSet上的TIMESTAMP WITH TIME ZONE来获取数据库中的数据。该Timestamp对象采用UTC格式。顺便说一下,Postgres将您的Instant存储在UTC中,并且在使用该数据作为存储过程的一部分调整为UTC之后,丢失原始时区或来自UTC的偏移量。

您应该尽快将java.sql.Timestamp / .Date / .Time转换为java.time类型。然后继续您的业务逻辑。

简而言之,java.time是...... ZoneId是UTC时间轴上的一个时刻。应用时区(ZonedDateTime)以获得java.sql.Timestamp ts = myResultSet.getTimestamp( 1 ); … Instant instant = ts.toInstant();

转换为java.time

因此,从Timestamp转换,获取Instant,应用ZoneId。

ZoneId zoneId = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

指定所需/预期的时区。适用于Instant。

ZonedDateTime now = ZonedDateTime.now( zoneId );

比较

获取当前时刻,用于比较。

isEqual

通过调用isBeforeisAfterBoolean beforeNow = zdt.isBefore( now ); 方法进行比较。

sudo yum install fontconfig

关于java.time

java.sql.Timestamp框架内置于Java 8及更高版本中。这些类取代了麻烦的旧java.time日期时间类,例如legacyjava.util.Date和& Calendar

现在位于SimpleDateFormatJoda-Time项目建议迁移到maintenance mode类。

要了解详情,请参阅java.time。并搜索Stack Overflow以获取许多示例和解释。规范是Oracle Tutorial

从哪里获取java.time类?

How to use ThreeTenABP…项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如ThreeTen-ExtraIntervalYearWeekYearQuarter