java.util.Date与 java.sql.Date两个包下Date的区别与联系

一般我在项目中导入需要的包,大部分情况下都会根据IDE的提示自动导入默认的包,少数情况下会扫一眼,看看是不是需要的包,极少情况会斟酌一下,确认一下这就是需要的包。
最近在项目中导入JDK中的Date包时,在后来回看代码的时候,发现不同的类中导入的Date依赖包还不太一样,也是那个时候才发现Date在俩不同的包中。之前没有注意过这个问题,那这俩包中的日期有什么联系与区别呢?


区别与联系:

首先查看Api,发现java.sql.Date是java.util.Date的子类。

在这里插入图片描述

这三个类都是对应于jdbc处理日期格式的类,只是有着不同的日期精度和格式。

java.sql.Date类:

  一个包装了毫秒值的瘦包装器 (thin wrapper),它允许 JDBC 将毫秒值标识为 SQL DATE 值。毫秒值表示自 1970 年 1 月 1 日 00:00:00 GMT 以来经过的毫秒数。
  为了与 SQL DATE 的定义一致,由 java.sql.Date 实例包装的毫秒值必须通过将小时、分钟、秒和毫秒设置为与该实例相关的特定时区中的零来“规范化”。
  【以上来官方api】

简要的说: 日期格式“规范化”的java.sql.Date只包含年月日信息,时分秒毫秒都会清零。格式类似:YYYY-MM-DD。当我们调用ResultSet的getDate()方法来获得返回值时,java程序会参照"规范"的java.sql.Date来格式化数据库中的数值。因此,如果数据库中存在的非规范化部分的信息将会被截取。 也就是说,如果是 2020-12-05 15:15:25 这样的时间点存取数据,那么存在数据库中的值就是:2020-12-05 00:00:00
类型转换: 如果把java.sql.Date值通过PrepareStatement的setDate方法存入数据库时,java程序会对传入的java.sql.Date规范化,非规范化的部分将会被劫取。然而,我们java.sql.Date一般由java.util.Date转换过来,如:java.sql.Date sqlDate=new java.sql.Date(new java.util.Date().getTime()). 显然,这样转换过来的java.sql.Date往往不是一个规范的java.sql.Date.要保存java.util.Date的精确值, 需要利用java.sql.Timestamp.

在这里插入图片描述

时间显示格式:


【父类】java.util.Date日期格式为:年月日时分秒
【子类】java.sql.Date日期格式为:年月日[只存储日期数据不存储时间数据]
【子类】java.sql.Time日期格式为:时分秒
【子类】java.sql.Timestamp日期格式为:年月日时分秒纳秒(毫微秒)


四种对象内部均使用系统时间作为标准数据 :

·系统时间:自 1970 年 1 月 1 日 00:00:00 GMT 以来的毫秒数,即格林尼治标准时间(GMT)
·本地时间:根据时区不同打印出来的时间[当时区为GMT+0时,系统时间与本地时间相同]
我们使用的是以本地时间为参考标准的


针对不同的数据库选用不同的日期类型 :

  需要了解数据库里存储时间的精度。

  Date类处理。基本上,数据库通常至少支持三种日期时间字段的形式,即日期、时间和时间戳。在jdbc和它们中的每一个java.util.Date..这三种语言的快速语义如下:java.sql.Date对应于sql日期,这意味着它存储年月日当小时、分钟、秒和毫秒被忽视了。java.sql.Time对应于sql time,只包含以下信息:小时、分钟、秒和毫秒.java.sql.Timestamp对应于SQL时间戳,该时间戳的确切日期为纳秒(util.Date只支持毫秒!)具有可定制的精度。与这三种类型相关的使用JDBC驱动程序时最常见的错误之一是,这些类型被错误地处理。这意味着sql.Date时区是特定的吗,sql.Time包含当前年份、月份和日等。最后:用哪一个?实际上取决于字段的SQL类型,Java处理时可以格式化日期。
  有些数据库,比如MySQL,精度为毫秒,然而另一些数据库,包括Oracle,存储SQL DATE类型数据时,毫秒部分的数据是不保存的。以下操作中容易出现不易被发现的BUG:获得一个JAVA里的日期对象。从数据库里读取日期试图比较两个日期对象是否相等。如果毫秒部分丢失,本来认为相等的两个日期对象用Equals方法可能返回false。.sql.Timestamp类比java.util.Date类精确度要高。这个类包了一个getTime()方法,但是它不会返回额外精度部分的数据,因此必须使用...总之,java.util.Date 就是Java的日期对象,而java.sql.Date 是针对SQL语句使用的,只包含日期而没有时间部分。

猜你喜欢

转载自blog.csdn.net/LZ15932161597/article/details/110440385