自学内容网 自学内容网

一次理清楚Java中的日期和时间

Java中的日期和时间

概述

        学习最大的问题困难在于沉下心,现实社会纷乱复杂,充满诱惑,同时随着成家立业年岁增长更无当年之志,顿感无力。回想公瑾当年之言:“日抚谣琴听音,夜有娇妻伴读,此生足矣。” 然而兵败,乃叹曰:“深感人生之艰难,就像那不息之长河,虽有东去大海之志,却流程缓慢,征程多艰。然江河水总有入海之时,而人生之志,却常常难以实现,令人抱恨终生!”,这句话让人感慨颇深。

日期时间类对比分析

        日期在每天的开发中都会用到,本篇文章意在通过汇总讲解的方式让读者能够一次理清楚Java中的日期和时间,这里主要会讲解Date类、DateFormat类、Calendar类、 LocalDateTime类。

        Java8之前我们都是使用Date日期类来处理时间,这里其实还有一个要对比的就是jdk中有两个Date类,分别是:java.util.Date和java.sql.Date

由源码可以看出java.sql.Date继承自java.util.Date,一般我们在记录日期的时候不建议使用sql包下的Date,因为java.sql.Date只是记录年月日,这里做了一个小的对比:

输出结果如下所示:

        可以得出如下结论,java.util.Date直接输出的话格式不好阅读,需要使用SimpleDateFormat来格式化,然而SimpleDateFormat并非线程安全的,翻看源码可以看到java.util.Date中大部分方法目前已经废弃了。

        JDK1.1推出了Calendar类,用来代替Date类中得到年、月、日、小时等时间元素的api,Calendar提供了一系列获取时间元素的api,并且使用起来也比较简单,通过Calendar.getInstance()获取到Calendar对象,调用一系列API得到时间元素,代码如下:

Calendar 类通常用于执行日期和时间计算

Date 存在如下的不足:

时区问题: Date 类不处理时区信息,它只表示一个时间点,通常默认为 GMT(格林威治标准时间)。这导致了很多时区相关的问题,因为日期和时间需要根据时区进行转换和显示。
线程不安全性: Date 类是可变的。由于 Java 中的日期和时间操作通常需要是线程安全的,这种可变性可能导致并发问题。

因为上述问题,Java 引入了新的日期和时间 API,如 java.time 包,它提供了更强大和安全的日期和时间处理能力。如果你在项目中需要处理日期和时间,建议使用新的日期和时间 API,如 LocalDateTime、ZonedDateTime 等,以避免 Date 类的问题。

LocalDateTime满足了线程安全性和时区支持:

线程安全性: java.time.LocalDateTime 是不可变的,一旦创建了对象,它的值不能被修改。这保证了在多线程环境中使用时不会出现并发问题。


时区支持: LocalDateTime 提供了更好的时区支持。它存储日期和时间信息,但不包含时区信息。这允许你在需要时将日期时间信息与特定时区相关联,而不会像 java.util.Date 那样受限于默认时区(通常是 GMT)。你可以使用 ZoneId 来将 LocalDateTime 转换为特定时区的时间,例如:

LocalDateTime localDateTime = LocalDateTime.now();
ZoneId zoneId = ZoneId.of("America/New_York");
ZonedDateTime zonedDateTime = localDateTime.atZone(zoneId);

总结

        日期和时间类应该是每天都会打交道的,但是很多人一直都没理清楚Java中的日期和时间类,本文意在对比Java中各日期时间类,从而分析清楚我们在日常研发中该如何选用,希望给本文能给大家带来收获。


    原文地址:https://blog.csdn.net/wanghengwhwh/article/details/145268487

    免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!