与数据库通信时使用对象而不是字符串。对于日期时间值,请使用日期时间对象。
java.time
避免麻烦的旧日期,时间类,包括Calendar
和GregorianCalendar
。它们设计不佳,缺陷和混乱。在他们的烦恼中,toString
方法在生成字符串时动态应用JVM的当前默认时区,这很有帮助,但事实证明这是一种反特性。
而是使用现代的java.time类。
如果您的JDBC driver更新为JDBC 4.2和later,请直接使用java.time类型而不是java.sql类型。
改变您的输入字符串以符合ISO 8601格式。将中间的空间更改为T
。
String input = "2008-10-29 14:56:59".replace(" " , "T") ;
解析为LocalDateTime
,因为你没有输入时区的任何指示或偏移从-UTC。
LocalDateTime ldt = LocalDateTime.parse(input) ;
或者指定日期时间值为整数。
LocalDateTime ldt = LocalDateTime.of(2013 , 12 , 1 , 0 , 0 , 0 , 0) ;
如果您的数据库列的类型为TIMESTAMP WITHOUT TIME ZONE
,那么您已准备好进行查询。您一定要了解,如果没有一个时区的上下文或偏移从-UTC,这样的价值观做不代表一个特定的时刻,是不是点在时间轴上,而他们对可能的时刻模糊的想法。
String sql = "SELECT * FROM tbl_ WHERE when_ >= ? ; " ;
PreparedStatement ps = conn.prepareStatement(sql) ;
ps.setObject(1 , ldt) ; // Call `setObject` to pass a java.time object directly without converting into `java.sql.*` type.
ResultSet resultSet = ps.executeQuery() ;
…
LocalDateTime ldt = resultSet.getObject(… , LocalDateTime.class) ;
如果你本来打算跟踪在时间轴上的实际的时刻,特定的点,那么你就可以使用TIMESTAMP WITH TIME ZONE
作为数据库列类型,并使用Instant
和ZonedDateTime
java.time类。
使用['SimpleDateFormat'(http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html)? –
感谢您的链接,只是读它。那么''yyyy-MM-dd HH:mm:ss''是否有诀窍? –
是的,它会将日期转换为您想要的格式。 –