Java 中的 util.Date 与 sql.Date

我们来比较一下两个日期类:java.util.Datejava.sql.Date

java.util.Date

java.util.Date 类表示一个特定的时间点,自 1970 年 1 月 1 日 00:00:00 GMT(纪元时间)以来的毫秒精度。该类参考的时区为 UTC。

我们可以通过两种方式初始化它。

  1. 无参构造

Date date = new Date();

这将创建一个新的日期对象,其时间设置为当前时间,精确到毫秒。

  1. 时间戳构造

Date date = new Date(1649028051030L);

1649028051030L 代表的是自 1970 年开始到某个时间点的毫秒数。

Date 还有一些构造函数用于构建时间,不过 Java8 之后,这些函数就被弃用了。

Date 是可变的。一旦我们初始化它,我们就可以改变它的内部值。例如,我们可以调用 setTime方法:

date.setTime(0);

通过 setTime() 方法将时间重置到了 1970 年开端。

Date 也不能很好地处理所有日期。从技术上讲,它应该反映协调世界时 (UTC)。但是,这取决于主机环境的操作系统。

大多数现代操作系统使用 1 天 = 24 小时 x 60 米 x 60 秒 = 86400 秒,也就是说,它没有考虑“闰秒”。

java.sql.Date

java.sql.Date 继承自 java.util.Date 类。

它的主要目的是表示 SQL DATE,它保存年、月和日,不保留时间数据。

java.util.Date 不包含时区信息,同样 java.sql.Date 也不含时区,我们本地环境和数据库服务器之间的时区转换取决于 JDBC 驱动程序的实现。

为了支持其他 SQL 数据类型:SQL TIME 和 SQL TIMESTAMP,还有两个 java.sql 类可用:java.sql.Time 和 java.sql.Timestamp。

## util.Date 转 sql.Date

sql.Date 是 util.Date 的子类,我们可以使用 Date() 的有参函数来相互转换。

java.sql.Date date=new java.sql.Date(d.getTime()); //其中d是java.util.Date类型

java.sql.Date 的一个使用场景是在 JDBC 的 PreparedStatement 中,添加时间,需要用到 sql.Date。

String sql = "insert into tbl_xxx values(?,?,?,?,?)";
PreparedStatement pstmt = null;
pstmt = conn.prepareStatement(sql);
Date now = new Date();
java.sql.Date date=new java.sql.Date(now.getTime());  //把java.util.Date转换成java.sql.Date
pstmt.setDate(2, date);

使用 java.sql.Date 是一种方式,还有一种方式将日期插入数据库,那就是将时间转为特定格式的字符串。

上面的场景中,还可以将 pstmt.setDate(2, date); 改为 pstmt.setString(2, "2022-04-09")

转载请注明出处:码谱记录 » Java 中的 util.Date 与 sql.Date
标签: