繁体   English   中英

使用postgres的TimeZone将日期转换为时间戳

[英]Convert Date to TimeStamp with TimeZone of postgres

我有类型为TIMESTAMP WITH TIME ZONE postgresql时间列,其样本值类似于1970-01-01 00:00:00+05:30我想将一个值与Date值进行比较:

Date date = new Date(0L);

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

所以我用

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”

java.time

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

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

对于较旧的JDBC驱动程序,请使用java.sql.Timestamp通过在ResultSet上调用getTimestamp从数据库中获取数据。 该时间戳记对象位于UTC中。 顺便说一下,Postgres将您的TIMESTAMP WITH TIME ZONE存储在UTC中,并且在使用该数据调整为UTC作为存储过程的一部分之后,会丢失原始时区或传入数据随附的UTC偏移。

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

简而言之,java.time是…… Instant是UTC时间轴上的一个时刻。 应用时区( ZoneId )以获取ZonedDateTime

转换为java.time

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

java.sql.Timestamp ts = myResultSet.getTimestamp( 1 );
…
Instant instant = ts.toInstant();

指定所需/预期的时区。 申请即时。

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

比较方式

获取当前时刻,以供比较。

ZonedDateTime now = ZonedDateTime.now( zoneId );

通过调用isEqualisBeforeisAfter方法进行比较。

Boolean beforeNow = zdt.isBefore( now );

关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧的旧式日期时间类,例如java.util.DateCalendarSimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参见Oracle教程 并在Stack Overflow中搜索许多示例和说明。 规格为JSR 310

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目为将来可能在java.time中添加内容提供了一个试验场。 您可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter ,和更多

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM