[英]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”
如果您的数据库驱动程序支持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
。
因此,从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 );
通过调用isEqual
, isBefore
或isAfter
方法进行比较。
Boolean beforeNow = zdt.isBefore( now );
java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧的旧式日期时间类,例如java.util.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参见Oracle教程 。 并在Stack Overflow中搜索许多示例和说明。 规格为JSR 310 。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目为将来可能在java.time中添加内容提供了一个试验场。 您可以在这里找到一些有用的类,比如Interval
, YearWeek
, YearQuarter
,和更多 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.