1

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

4

2 回答 2

1

一些数据库只存储日期的第二个精度。

SQLserverdatetime支持小数秒,但它会四舍五入到最接近的 3 毫秒。

如果您需要更高的精度,请将日期存储为 bigint 类型并改为传递now.getTime()Javalong值。

于 2013-09-06T16:04:10.150 回答
1

你可能会感到困惑:

  • java.util.Date以 UTC表示日期时间的类
  • java.sql.Date表示仅日期、没有时间和没有时区的类。

实际上,java.sql.Date 扩展了 java.util.Date 所以它实际上继承了时间,但通过将其设置为00:00:00.0UTC 来假装没有时间。类文档告诉你忽略继承关系(这是一个黑客)。令人困惑?是的,这些旧的日期时间类是一团糟、设计不佳、令人困惑和麻烦。

这些旧类被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. 您可以从 aZonedDateTime中提取一个Instant用于此转换目的。

java.sql.Timestamp ts = java.sql.Timestamp.from( instant );
java.sql.Timestamp ts = java.sql.Timestamp.from( zdt.toInstant() );

往另一个方向走。

Instant instant = mySqlTimestamp.toInstant();
于 2016-06-29T04:28:17.907 回答