ISO 8601
首先,如果这些输入实际上是问题中显示的字符串,请尽可能使用标准的ISO 8601 格式。标准格式对人类来说是直观的,并且更容易被计算机解析。事实上,java.time 类在解析/生成字符串时默认使用 ISO 8601 格式。
java.time
虽然我不了解 Oracle 中的查询(我自己是 Postgres 人),但我可以展示如何在 Java 端更多地形成查询。
理想情况下,我们会将输入字符串解析为OffsetDateTime,因为它缺少时区指示,只有与UTC 的偏移量。区域是一个偏移量加上一组用于处理异常情况的规则,例如夏令时 (DST)。时区以continent/region 的格式命名,例如America/Montreal。
不幸的是,Java 8 中的 java.time 实现在解析 DateTimeFormatter 类中的 offset-from-UTC 方面存在一些错误。所以在 Java 9 之前,这里有一些 hack 代码可以解析为 ZonedDateTime 并转换为更合适的 OffsetDateTime。
String input = "12/26/2016 3:58:16.491476 AM -06:00";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "MM/dd/uuuu h:m:s.SSSSSS a z" , Locale.ENGLISH );
OffsetDateTime odt = ZonedDateTime.parse ( input , f ).toOffsetDateTime ();
odt.toString(): 2016-12-26T03:58:16.491476-06:00
重复你的结束时刻。
如果您的 JDBC 驱动程序支持 JDBC 4.2 或更高版本,您可以直接通过 PreparedStatement::setObject 传递这些 java.time 类型。
如果不是,则转换为 java.sql 类型。要进行转换,请查看添加到旧类的新方法。 from 方法采用 Instant,这是 UTC 时间线上的一个时刻。您可以将Instant 视为去除了偏移量的OffsetDateTime。调用OffsetDateTime::toInstant 提取Instant。
java.sql.Timestamp ts = java.sql.Timestamp.from( odt.toInstant() ) ;
在您的开始和结束时刻都这样做。将这些 java.sql.Timestamp 对象传递给您的 PreparedStatement。
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。