我有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”
答案 0 :(得分:1)
如果您的数据库驱动程序支持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();
。
因此,从Timestamp转换,获取Instant,应用ZoneId。
ZoneId zoneId = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
指定所需/预期的时区。适用于Instant。
ZonedDateTime now = ZonedDateTime.now( zoneId );
获取当前时刻,用于比较。
isEqual
通过调用isBefore
,isAfter
或Boolean beforeNow = zdt.isBefore( now );
方法进行比较。
sudo yum install fontconfig
java.sql.Timestamp
框架内置于Java 8及更高版本中。这些类取代了麻烦的旧java.time日期时间类,例如legacy,java.util.Date
和& Calendar
现在位于SimpleDateFormat
的Joda-Time项目建议迁移到maintenance mode类。
要了解详情,请参阅java.time。并搜索Stack Overflow以获取许多示例和解释。规范是Oracle Tutorial。
从哪里获取java.time类?
How to use ThreeTenABP…项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如ThreeTen-Extra,Interval
,YearWeek
和YearQuarter
。