jdbc的Date类型处理,解决java.util.date与java.sql.date的时间数据丢失

本文介绍了在Java JDBC中处理日期和时间数据的最佳实践。重点讨论了如何使用java.sql.Timestamp类来替代java.sql.Date类,以确保完整保留日期与时间信息。此外,还提供了一些实用的代码示例来演示如何正确地设置和获取数据库中的日期时间数据。
 java.sql.Date 在jdbc使用时会用到,但是问题是只存储日期数据不存储时间数据。会丢失时间数据:
preparedStatement.setDate(1, new java.sql.Date(date.getTime()));

解决的方法是:preparedStatement.setTimestamp(1, new java.sql.Timestamp(new java.util.Date().getTime()));

使用java.sql.timestamp类。


同理,想要得到完整的数据,包括日期和时间,可以这样

java.util.Date d = resultSet.getTimestamp(1);

但是,这样处理更合适一些,可以避免一些潜在Timestamp 问题

java.util.Date d = new java.util.Date(resultSet.getTimestamp(1).getTime());

 

总之,往数据库存储的时候可以接收 java.util.Date类型,再用getTime()方法得到代表那个Date对象的long值,再以这个long值构造一个Timestamp对象存进数据库中。从存数据库里取的时候,可以先得到Timestamp用他的getTime()方法得到long值,再以这个long值构造一个java.util.Date对象,这样就可以对这个Date对象操作了。

没有用java.sql.Date类。

<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]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值