我们来比较一下两个日期类:java.util.Date
和 java.sql.Date
。
java.util.Date
java.util.Date 类表示一个特定的时间点,自 1970 年 1 月 1 日 00:00:00 GMT(纪元时间)以来的毫秒精度。该类参考的时区为 UTC。
我们可以通过两种方式初始化它。
- 无参构造
Date date = new Date();
这将创建一个新的日期对象,其时间设置为当前时间,精确到毫秒。
- 时间戳构造
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")