当您将以下内容插入到SQL数据库中时:
Date now = new Date(System.currentTimeMillis());
PreparedStatement audit = sqlConn.prepareStatement("INSERT INTO [Table](Date) VALUES (?)");
audit.setDate(1, now);
audit.execute();
结果如下:
2013-09-06 00:00:00.000
我还如何将时间信息插入数据库?
编辑:列数据类型为DateTime。
最佳答案
您可能会感到困惑:java.util.Date
类,它表示UTC中的日期和时间java.sql.Date
类代表仅日期,无日期和无时区。
实际上,java.sql.Date扩展了java.util.Date,因此它实际上继承了一天中的某个时间,但通过在UTC中将其设置为00:00:00.0
来假装没有一天中的时间。类文档告诉您忽略继承关系(这是hack)。令人困惑?是的,这些旧的日期时间类是一团糟,设计不良,令人困惑和麻烦的事情。
这些旧类被Java 8和更高版本中内置的java.time类所取代。许多功能已在ThreeTen-Backport中反向移植到Java 6和7,并在ThreeTenABP中进一步适应了Android。
如果您的数据库列的类型类似于SQL标准类型TIMESTAMP WITH TIME ZONE,则可以使用以下任一方法:Instant
UTC时间轴上的某个时刻,分辨率最高为纳秒。Instant instant = Instant.now();
ZonedDateTime
类似于Instant
,但已调整为特定时区。ZonedDateTime zdt = ZonedDateTime.now( ZoneId.of( "America/Montreal" ) );
如果您的JDBC驱动程序符合JDBC 4.2规范,则可以通过setObject
上的PreparedStatement
方法传递这两个参数。
如果您的驱动程序不支持直接使用java.time类型,则退回到使用java.sql类型。查找添加到旧类中的新方法,这些新方法可用于与java.time类型之间的相互转换。您正在寻找java.sql.Timestamp
类,尤其是日期时间值,该值可以与Instant
进行转换。您可以从ZonedDateTime
提取Instant
进行转换。
java.sql.Timestamp ts = java.sql.Timestamp.from( instant );
java.sql.Timestamp ts = java.sql.Timestamp.from( zdt.toInstant() );
走向另一个方向。
Instant instant = mySqlTimestamp.toInstant();
关于java - 将准确的时间插入数据库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18661929/