tl;博士
JDBC 4.2 及更高版本:
Boolean isFutureTask = myResultSet.getObject( "myDateColumn" , Instant.class )
.isAfter( Instant.now() ) ;
旧 JDBC:
Boolean isFutureTask = myResultSet.getTimestamp( … )
.toInstant()
.isAfter( Instant.now() ) ;
java.time
其他答案是正确的,但使用过时的类。 java.util.Date/.Calendar 类已被 Java 8 及更高版本中内置的 java.time 框架所取代。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。
大部分 java.time 功能在ThreeTen-Backport 中向后移植到 Java 6 和 7,并在 ThreeTenABP 中进一步适应 Android。
日期时间类型
您应该将日期时间值存储为date-time type in your database。我相信那将是TIMESTAMP 在 MySQL 中输入(但我自己是 Postgres 人)。
然后使用java.sql.Timestamp 类型将数据移入/移出数据库。
java.sql.Timestamp ts = myResultSet.getTimestamp( 1 );
立即从 java.sql 转换为 java.time。 java.sql 类是那些被证明设计不佳、令人困惑和麻烦的旧日期时间类的一部分。仅在更新 JDBC 驱动程序以直接处理 java.time 类型之前使用它们。
旧的java.util.Timestamp 有新的方法来转换为Instant 或从Instant 转换。 Instant 是 UTC 时间线上的时刻,分辨率为纳秒。
java.time.Instant instant = ts.toInstant();
获取当前时刻。
Instant now = Instant.now();
比较。
Boolean isStoredDateTimePast = now.isAfter( instant );
在JDBC 4.2 及更高版本中,您的JDBC driver 可能能够通过ResultSet::getObject 方法以Instant 对象的形式直接访问数据库中的值。
如果您必须解析该字符串,请将其转换为标准 ISO 8601 格式。用T 替换中间的空格。假设字符串表示与 UTC 的偏移量为零,则为 Zulu 附加 Z,这意味着 UTC。 java.time 类默认以 ISO 8601 格式解析/生成字符串。
String inputOriginal = "2011-12-30 17:10:00".
String input = inputOriginal.replace( " " , "T" ) + "Z" ;
Instant instant = Instant.parse( input );