java.util.Date, java.util.Calendar, java.sql.Date, java.sql.Time, java.sql.Timestamp区别和联系

java有关的项目开发工作中,我们常常要java.util.Date,  java.util.Calendar,   java.sql.Date,    java.sql.Time,   java.sql.Timestamp等几个类进行日期的处理和分析,那么这几个函数之间有什么样的联系,它们又有什么区别呢?

首先来说说它们之间的关系,java.util.Date这个类是java.sql.Date,  java.sql.Time,  java.slq.Timestamp这三个类的父类。这三个类对java.util.Date类进行了包装。

java.sql.Date类屏蔽了java.util.Date类的时间有关的方法(形如:hh:mm:ss,因此,不可以通过这个类访问时间有关的信息,比如,如果你通过sqlDate.getHour()方法去访问小时信息,此方法会抛出一个IllegalArgumentException异常。这是因为java.sql.Date在继承java.util.Date类的时候对父类进行了重写,禁用了时间访问的方法。之所以这么处理,是为了和数据库的Date数据类型相匹配,数据库的Date数据类行只是保存日期有关的字段。

Java.sql.Time类屏蔽了java.util.Date的日期有关的字段(形如:yyyy-MM-dd,因此,不能通过这个类访问日期有关的信息,比如:如果你通过sqlTime.getYear()方法去获取年有关的信息,此方法会抛出一个IllegalArgumentException异常。这是因为java.sql.Time在继承java.util.Date类的时候对父类进行了重写,禁用了日期访问的方法。之所以这么处理,是为了和数据库的Time数据类型相匹配,数据库的Time数据类行只是保存时间有关的字段。

Java.sql.Timestamp字段则对java.util.Date这个类进行了扩充,它在java.util.Date类的基础上增加了毫秒的时间访问控制,因此,你可以通过getNanos()方法去获取时间的毫微秒数(注意此处获取的时间是以毫微秒为单位的,1秒等于十亿毫微秒),同样的,这也是为了和数据库中的Timestamp数据类型进行匹配。

理清了上述四个类的关系,那么java.util.Datejava.util.Calendar类有什么关系呢?

Java.util.Calendar类是java.util.Date类的一个更加深入,更加全面的替代。Java.util.Calendar类支持java.util.Date的所有功能,此外,Calendar还引入了多语言,多区域的特性,可以根据需要获取不同区域,不同时区的时间,Calendar还增加了比Date更加方便和快捷的许多操作,如获取一年当中的第几个星期,各个月的天数等便捷的方法。

Java.util.Calendar区别与java.util.Date的几个地方也需要注意一下:首先,Calendar增加了毫秒的时间段,通过它可以获取时间点的毫秒值,而java.util.Date只是精确到秒。其次,Calendar过去年的时候是当前年份比如:2010,而Date获取年份的时获取到的是当前年份-1900的一个值(2010-1900=110,因此,你调用getYear后过去的值就是110)。最后Calendar是一个抽象类,之所以能够实例化,是因为此处的Calendar充当了一个类似于工厂的作用,在getInstance方法中实例化了Calendar子类GregorianCalendar,并把它返回给客户使用。

Java中,可以使用`java.time.LocalDateTime`类来求解时间差。要计算两个`LocalDateTime`对象之间的时间差,可以使用`Duration`类。下面是一个示例代码: ```java import java.time.Duration; import java.time.LocalDateTime; public class Main { public static void main(String[] args) { LocalDateTime startDateTime = LocalDateTime.of(2021, 5, 25, 10, 30); // 设置起始时间 LocalDateTime endDateTime = LocalDateTime.of(2021, 5, 26, 10, 0); // 设置结束时间 Duration duration = Duration.between(startDateTime, endDateTime); // 计算时间差 long days = duration.toDays(); // 获取天数差 long hours = duration.toHours() % 24; // 获取小时数差 long minutes = duration.toMinutes() % 60; // 获取分钟数差 long seconds = duration.getSeconds() % 60; // 获取秒数差 System.out.println("时间差:" + days + "天 " + hours + "小时 " + minutes + "分钟 " + seconds + "秒"); } } ``` 该代码中,我们使用`LocalDateTime`类的`of`方法分别创建了起始时间和结束时间的`LocalDateTime`对象。然后,使用`Duration.between`方法计算了两个时间的时间差。最后,通过`Duration`类提供的方法,可以分别获取到天数差、小时数差、分钟数差和秒数差。 请注意,上述代码仅为示例,你可以根据自己的实际需求进行相应的修改。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Java、MySql中时间日期总结,java.util.Datejava.sql.Timejava.sql.DateTimestampCalendar,详细...](https://blog.csdn.net/weixin_45729075/article/details/106322431)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值