当您将以下内容插入到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/

10-09 00:46
查看更多