java.sql.date与java.util.date区别以及数据库中插入带时分秒的时间

本文介绍了Java中日期时间处理的关键类,包括java.sql.Date、java.sql.Time、java.sql.Timestamp及其与java.util.Date的区别和联系。详细解释了如何在数据库操作中正确使用这些类,特别是如何保留时间精度。

java.sql.Date,java.sql.Time和java.sql.Timestamp三个都是java.util.Date的子类(包装类)。

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

说白了,java.sql.Date就是与数据库Date相对应的一个类型,而java.util.Date是纯java的Date。

从类 java.util.Date 继承的方法  
after, before, clone, compareTo, equals, getDate, getDay, getMonth, getTime, getTimezoneOffset, getYear, hashCode, parse, setDate, setMonth, setYear, toGMTString, toLocaleString, UTC 

sql.Date也有时间的
如果不想用oracle的to_date函数,可以自己生成sql.Date对象
String s = "2012-06-21 00:10:00";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
java.util.Date d1 = sdf.parse(s); //先把字符串转为util.Date对象
java.sql.Date d2 = new java.sql.Date(d1.getTime()); //再转换为sql.Date对象

想要将带时分秒的时间插入到数据库中,除了Oracle数据库的to_date()方法之外。我们可以用 Timestamp类来实现。java.sql.Date是规范化之后的时间,其时分秒部分被截取掉了。

java.sql.Date是为了配合SQL DATE而设置的数据类型。“规范化”的java.sql.Date只包含年月日信息,时分秒毫秒都会清零。格式类似:YYYY-MM-DD。当我们调用ResultSet的getDate()方法来获得返回值时,java程序会参照"规范"的java.sql.Date来格式化数据库中的数值。因此,如果数据库中存在的非规范化部分的信息将会被劫取。
 在sun提供的ResultSet.java中这样对getDate进行注释的:
       Retrieves the of the designated column in the current row of this <code>ResultSet</code> object as a “java.sql.Date” object in the Java programming language.


         同理。如果我们把一个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.

eg:

 

[java]  view plain copy
  1. <span style="font-size:18px;">  String s="2012-01-02 03:12:21";  
  2.         SimpleDateFormat sp = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");  
  3.         java.util.Date du = sp.parse(s);  
  4.             java.sql.Timestamp st = new java.sql.Timestamp(du.getTime());</span>  


把一个日期值写入数据库中,发现由java.util.Date转存为java.sql.Date后,只有年月日,没有了时分秒: 

  1. java.util.Date ud = new java.util.Date();   
  2. java.sql.Date sd = new java.sql.Date(ud.getTime()); 

  这个可是不行的,用户至少要精确到分。由于java.sql.Date为了能够遵守sql日期标准,把所有时分秒都归了零。只有用Timestamp来进行保存,由于Timestamp是子类,因此写好的bean里面不需要修改数据类型。 

  1. pstmt.setTimestamp(15new java.sql.Timestamp(Calendar.getInstance().getTime().getTime()));  //当前时间  
  2. pstmt.setTimestamp(16new java.sql.Timestamp(userFile.getCreateTime().getTime()));  //指定时间   

对于指定时间还可以用Calendar类的setTime()方法来设置

[java]  view plain copy
  1. <span style="font-size:18px;">Calendar cal = Calendar.getInstance();  
  2.             System.out.println(cal.getTime().getTime());  
  3.         String string="2012-01-01 01:02:03";  
  4.     SimpleDateFormat sp = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");  
  5.         java.util.Date da = sp.parse(string);  
  6.         cal.setTime(da);  
  7.             System.out.println(cal.getTime().getTime());</span>  


 在数据库中插入带时分秒的时间需要用Timestamp。一般做这种操作用框架居多,我就说一下Hibernate吧。在数据库表中字段类型设置为Date数据类型,代码中映射的字段类型设置为 Timestamp类型, private Timestamp date;  在映射文件中 <property name="date" type="timestamp" column="sj"/> Type也是时间戳类型的。在赋值取值的时候用前面的操作获取到需要的时间的时间戳对象直接赋值就行。然后就可以用Hibernate执行方法将带时分秒的时间存入到数据库里了。(不过这一点意义好像不是很大,大多都是直接varchar2存进去,取时候再to_date一下或者在代码里处理)

      还需要说一点的就是

在使用SimpleDateFormat时格式化时间的 yyyy.MM.dd 为年月日而如果希望格式化时间为12小时制的,则使用hh:mm:ss 如果希望格式化时间为24小时制的,则使用HH:mm:ss,上代码:

[java]  view plain copy
  1. SimpleDateFormat ss = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");//12小时制     


 

[java]  view plain copy
  1. SimpleDateFormat sdformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//24小时制  


 

[java]  view plain copy
  1. Date d = new Date();  
  2.         SimpleDateFormat ss = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");//12小时制  
  3.         System.out.println(ss.format(d));  
  4.   
  5.         Date date = new Date();  
  6.         SimpleDateFormat sdformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//24小时制  
  7.         String LgTime = sdformat.format(date);  
  8.         System.out.println(LgTime);  
  9.   
  10.   
  11. 结果为  
  12. 2008-05-28 01:32:54  
  13. 2008-05-28 13:32:54  


 Date类,已经很少用了。更多使用的是Calendar   
  Calendar
    date    =    Calendar.getInstance();   
  date.get(Calendar.HOUR_OF_DAY    );//得到24小时机制的   
  date.get(Calendar.HOUR);//    得到12小时机制的   

<think> 我们正在讨论java.util.Datejava.sql.Date区别。 根据引用[1]和引用[2]提供的信息,我们可以总结出以下区别: 1. 包路径不同: - `java.util.Date`位于`java.util`包中。 - `java.sql.Date`位于`java.sql`包中。 2. 时间精度不同: - `java.util.Date`表示特定的时间点,精确到毫秒(包含日期和时间信息)。 - `java.sql.Date`只表示日期(年、月、日),不包含时间信息(时分秒被设置为0)。 3. 构造函数不同: - `java.util.Date`有多个构造函数,可以传入年、月、日、时、分、秒等,也可以传入毫秒数。 - `java.sql.Date`的构造函数只接受一个表示自1970年1月1日00:00:00 GMT以来的毫秒数的长整型参数,并且它只保留日期部分。 4. 方法不同: - `java.util.Date`提供了丰富的方法来处理日期和时间。 - `java.sql.Date`主要提供数据库交互的方法,例如将日期转换为SQL格式的字符串(如"yyyy-mm-dd")。 5. 用途不同: - `java.util.Date`用于Java应用程序中通用的日期和时间处理。 - `java.sql.Date`专用于数据库操作,数据库中的DATE类型字段对应(只包含日期,不包含时间)。 此外,引用[2]还提到,当我们使用`java.sql.Date`时,它会丢失时间部分。例如: ```java java.util.Date ud = new java.util.Date(); // 包含当前日期和时间 java.sql.Date sd = new java.sql.Date(ud.getTime()); // 只保留日期部分,时间部分(时分秒)会被设为0 ``` 因此,在需要保存完整时间(包括时分秒)到数据库时,应使用`java.sql.Timestamp`(对应数据库的TIMESTAMP类型)而不是`java.sql.Date`。 需要注意的是,`java.sql.Date`是`java.util.Date`的子类,因此可以在任何使用`java.util.Date`的地方使用`java.sql.Date`,但要注意时间部分的丢失。 总结: - 如果你需要处理日期和时间,使用`java.util.Date`。 - 如果你需要将日期(不包括时间)存入数据库(对应SQLDATE类型),使用`java.sql.Date`。 注意:在Java 8之后,推荐使用新的日期时间API(`java.time`包)来代替旧的日期时间类(包括`java.util.Date`和`java.sql.Date`)。例如,`LocalDate`用于表示日期,`LocalDateTime`用于表示日期和时间,它们更清晰、更易于使用。 </think> ### Java.util.Date java.sql.Date区别详解 根据引用内容[^1][^2],这两个类的核心区别如下: 1. **包路径不同** - `java.util.Date`:标准 Java 日期类,位于 `java.util` 包 - `java.sql.Date`:数据库专用的日期类,位于 `java.sql` 包 2. **时间精度不同** - `java.util.Date`:完整时间戳(年/月/日/时/分/秒/毫秒) - `java.sql.Date`:**仅保留日期部分**(年/月/日),时间部分会被截断 ```java java.util.Date ud = new java.util.Date(); // 包含完整时间java.sql.Date sd = new java.sql.Date(ud.getTime()); // 时分秒被设为00:00:00 ``` 3. **构造函数差异** - `java.util.Date`:支持多种构造函数(毫秒数/String/年/月/日等) - `java.sql.Date`:**仅接受毫秒数参数** ```java // 合法构造 new java.sql.Date(System.currentTimeMillis()); // 非法构造(编译错误) new java.sql.Date(2023, 10, 25); ``` 4. **方法功能差异** - `java.util.Date`:提供完整时间操作方法(`after()`, `before()`, `getHours()`等) - `java.sql.Date`:**禁用时间相关方法**(调用 `getHours()` 会抛出异常) 5. **数据库兼容性** - `java.sql.Date` 专为 SQL `DATE` 类型设计(格式:`YYYY-MM-DD`) - 时间部分需使用 `java.sql.Timestamp` 存储: ```java // 需要完整时间戳时 java.sql.Timestamp ts = new Timestamp(ud.getTime()); ``` 6. **类型转换** ```java // util.Datesql.Date(丢失时间信息) java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime()); // sql.Dateutil.Date时间固定为00:00:00) java.util.Date utilDate = new java.util.Date(sqlDate.getTime()); ``` ### 使用场景建议 | **场景** | **推荐类** | |------------------------|-------------------| | 通用日期时间处理 | `java.util.Date` | | JDBC 操作数据库 DATE 字段 | `java.sql.Date` | | 需要时分秒数据库存储 | `java.sql.Timestamp` | > 提示:Java 8+ 推荐使用 `java.time.LocalDate`(日期)和 `LocalDateTime`(日期时间)替代旧 API,类型安全且线程安全[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值