• 详解JDK8中新的日期时间工具类,真的很好用


    1.旧版日期时间的问题

      在旧版本中JDK对于日期和时间这块的时间是非常差的。

    1. /**
    2. * 旧版日期时间设计的问题
    3. */
    4. @Test
    5. public void test01() throws Exception{
    6. // 1.设计不合理
    7. Date date = new Date(2021,05,05);
    8. System.out.println(date);
    9. // 2.时间格式化和解析操作是线程不安全的
    10. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    11. for (int i = 0; i < 50; i++) {
    12. new Thread(()->{
    13. // System.out.println(sdf.format(date));
    14. try {
    15. System.out.println(sdf.parse("2021-05-06"));
    16. } catch (ParseException e) {
    17. e.printStackTrace();
    18. }
    19. }).start();
    20. }
    21. }

          1、设计不合理,在java.util和java.sql的包中都有日期类,java.util.Date同时包含日期和时间的,而java.sql.Date仅仅包含日期,此外用于格式化和解析的类在java.text包下。
            2、非线程安全,java.util.Date是非线程安全的,所有的日期类都是可变的,这是java日期类最大的问题之一。
            3、时区处理麻烦,日期类并不提供国际化,没有时区支持。

    2. 新日期时间API介绍

            JDK 8中增加了一套全新的日期时间API,这套API设计合理,是线程安全的。新的日期及时间API位于 java.time 包
    中,下面是一些关键类。

    LocalDate :表示日期,包含年月日,格式为 2019-10-16
    LocalTime :表示时间,包含时分秒,格式为 16:38:54.158549300
    LocalDateTime :表示日期时间,包含年月日,时分秒,格式为 2018-09-06T15:33:56.750
    DateTimeFormatter :日期时间格式化类。
    Instant:时间戳,表示一个特定的时间瞬间。
    Duration:用于计算2个时间(LocalTime,时分秒)的距离
    Period:用于计算2个日期(LocalDate,年月日)的距离
    ZonedDateTime :包含时区的时间
      

    Java中使用的历法是ISO 8601日历系统,它是世界民用历法,也就是我们所说的公历。平年有365天,闰年是366
    天。此外Java 8还提供了4套其他历法,分别是:

    ThaiBuddhistDate:泰国佛教历
    MinguoDate:中华民国历
    JapaneseDate:日本历
    HijrahDate:伊斯兰历

    3.LocalDate常用基础操作

    1. @Test
    2. public void test01(){
    3. // 1.创建指定的日期
    4. LocalDate date1 = LocalDate.of(2021, 05, 06);
    5. System.out.println("指定日期 = "+date1);
    6. // 2.得到当前的日期
    7. LocalDate now = LocalDate.now();
    8. System.out.println("当前日期 = "+now);
    9. // 3.根据LocalDate对象获取对应的日期信息
    10. System.out.println("年:" + now.getYear());
    11. System.out.println("月:" + now.getMonth().getValue());
    12. System.out.println("日:" + now.getDayOfMonth());
    13. System.out.println("星期:" + now.getDayOfWeek().getValue());
    14. }

    4.LocalTime常用基础操作

    1. @Test
    2. public void test02(){
    3. // 1.得到指定的时间
    4. LocalTime time = LocalTime.of(5,26,33,23145);
    5. System.out.println("指定时间->" + time);
    6. // 2.获取当前的时间
    7. LocalTime now = LocalTime.now();
    8. System.out.println("当前时间->" + now);
    9. // 3.获取时间信息
    10. System.out.println("获取当前小时->" + now.getHour());
    11. System.out.println("获取当前分钟->" + now.getMinute());
    12. System.out.println("获取当前秒中->" + now.getSecond());
    13. System.out.println("获取当前毫秒->" + now.getNano());
    14. }

    5.LocalDateTime日期和时间类型常用基础操作

    LocalDateTime参数:

    year:表示的年份,从MIN_YEAR到MAX_YEAR

    month:表示月份

    dayOfMonth:表示日期,从1到31

    hour:表示小时,从0到23

    minute:表示分钟,从0到59

    second:表示从0到59的秒钟

    nanoOfSecond:表示纳秒,从0到999,999,999

    1. @Test
    2. public void test03(){
    3. // 获取指定的日期时间
    4. LocalDateTime dateTime =
    5. LocalDateTime.of(2020
    6. , 06
    7. , 01
    8. , 12
    9. , 12
    10. , 33
    11. , 213);
    12. System.out.println("获取指定日期时间->" + dateTime);
    13. // 获取当前的日期时间
    14. LocalDateTime now = LocalDateTime.now();
    15. System.out.println("获取当前日期时间->" + now);
    16. // 获取日期时间信息
    17. System.out.println("获取年份->" + now.getYear());
    18. System.out.println("获取月份->" + now.getMonth().getValue());
    19. System.out.println("获取日->" + now.getDayOfMonth());
    20. System.out.println("获取星期几->" + now.getDayOfWeek().getValue());
    21. System.out.println("获取小时->" + now.getHour());
    22. System.out.println("获取分钟->" + now.getMinute());
    23. System.out.println("获取秒钟->" + now.getSecond());
    24. System.out.println("获取毫秒->" + now.getNano());
    25. }

    6.日期时间的修改

    1. @Test
    2. public void test01(){
    3. LocalDateTime now = LocalDateTime.now();
    4. System.out.println("now = "+now);
    5. // 修改日期时间 对日期时间的修改,对已存在的LocalDate对象,创建了它模板
    6. // 并不会修改原来的信息
    7. LocalDateTime localDateTime = now.withYear(1998);
    8. System.out.println("now :"+now);
    9. System.out.println("修改后的:" + localDateTime);
    10. System.out.println("月份:" + now.withMonth(10));
    11. System.out.println("天:" + now.withDayOfMonth(6));
    12. System.out.println("小时:" + now.withHour(8));
    13. System.out.println("分钟:" + now.withMinute(15));
    14. // 在当前日期时间的基础上 加上或者减去指定的时间
    15. System.out.println("两天后:" + now.plusDays(2));
    16. System.out.println("10年后:"+now.plusYears(10));
    17. System.out.println("6个月后 = " + now.plusMonths(6));
    18. System.out.println("10年前 = " + now.minusYears(10));
    19. System.out.println("半年前 = " + now.minusMonths(6));
    20. System.out.println("一周前 = " + now.minusDays(7));
    21. }

    7.日期时间的比较

    JDK8中要实现 日期的比较 isAfter  isBefore isEqual 通过这几个方法来直接比较

    1. @Test
    2. public void test02(){
    3. LocalDate now = LocalDate.now();
    4. LocalDate date = LocalDate.of(2022, 1, 1);
    5. System.out.println(now.isAfter(date)); // false
    6. System.out.println(now.isBefore(date)); // true
    7. System.out.println(now.isEqual(date)); // false
    8. }

    8.格式化和解析操作

    1. /**
    2. * 日期格式化
    3. */
    4. @Test
    5. public void test01(){
    6. LocalDateTime now = LocalDateTime.now();
    7. // 指定格式 使用系统默认的格式 2021-05-27T16:16:38.139
    8. DateTimeFormatter isoLocalDateTime = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
    9. // 将日期时间转换为字符串
    10. String format = now.format(isoLocalDateTime);
    11. System.out.println("format = " + format);
    12. // 通过 ofPattern 方法来指定特定的格式
    13. DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    14. String format1 = now.format(dateTimeFormatter);
    15. // 2021-05-27 16:16:38
    16. System.out.println("format1 = " + format1);
    17. // 将字符串解析为一个 日期时间类型
    18. LocalDateTime parse = LocalDateTime.parse("1997-05-06 22:45:16", dateTimeFormatter);
    19. // parse = 1997-05-06T22:45:16
    20. System.out.println("parse = " + parse);
    21. }

    9.计算日期时间差

    1. Duration:用来计算两个时间差(LocalTime)
    2. Period:用来计算两个日期差(LocalDate)
    1. @Test
    2. public void test01(){
    3. // 计算时间差
    4. LocalTime now = LocalTime.now();
    5. LocalTime time = LocalTime.of(22, 48, 59);
    6. System.out.println("now = " + now);
    7. // 通过Duration来计算时间差
    8. Duration duration = Duration.between(now, time);
    9. System.out.println(duration.toDays()); // 0
    10. System.out.println(duration.toHours()); // 6
    11. System.out.println(duration.toMinutes()); // 368
    12. System.out.println(duration.toMillis()); // 22124240
    13. // 计算日期差
    14. LocalDate nowDate = LocalDate.now();
    15. LocalDate date = LocalDate.of(1997, 12, 5);
    16. Period period = Period.between(date, nowDate);
    17. System.out.println(period.getYears()); // 23
    18. System.out.println(period.getMonths()); // 5
    19. System.out.println(period.getDays()); // 22
    20. }

    10. 时间校正器

                 方法                                                            描述
    dayOfWeekInMonth                             返回同一个月中每周的第几天
    firstDayOfMonth                                             返回当月的第一天
    firstDayOfNextMonth                                  返回下月的第一天
    firstDayOfNextYear                                     返回下一年的第一天
    firstDayOfYear                                             返回本年的第一天
    firstInMonth                                                     返回同一个月中第一个星期几
    lastDayOfMonth                                             返回当月的最后一天
    lastDayOfNextMonth                                     返回下月的最后一天
    lastDayOfNextYear                                     返回下一年的最后一天
    lastDayOfYear                                             返回本年的最后一天
    lastInMonth                                             返回同一个月中最后一个星期几
    next / previous                                     返回后一个/前一个给定的星期几
    nextOrSame / previousOrSame          返回后一个/前一个给定的星期几,如果这个值满足条件,直接返回

    1. LocalDateTime now = LocalDateTime.now();
    2. System.out.println("当前时间:" + now + "======>" + now.getDayOfWeek());
    3. System.out.println("下一个周一:" + now.with(TemporalAdjusters.next(DayOfWeek.MONDAY)));
    4. System.out.println("上一个周一:" + now.with(TemporalAdjusters.previous(DayOfWeek.MONDAY)));
    5. System.out.println("下一个周五:" + now.with(TemporalAdjusters.nextOrSame(DayOfWeek.FRIDAY)));
    6. System.out.println("上一个周五:" + now.with(TemporalAdjusters.previousOrSame(DayOfWeek.FRIDAY)));
    7. System.out.println("本月最后一个周五:" + now.with(TemporalAdjusters.lastInMonth(DayOfWeek.FRIDAY)));
    8. System.out.println("本月第一个周五:" + now.with(TemporalAdjusters.firstInMonth(DayOfWeek.FRIDAY)));
    9. System.out.println("本月第一天:" + now.with(TemporalAdjusters.firstDayOfMonth()));
    10. System.out.println("本月最后一天:" + now.with(TemporalAdjusters.lastDayOfMonth()));
    11. System.out.println("下月的第一天:" + now.with(TemporalAdjusters.firstDayOfNextMonth()));
    12. System.out.println("今年的第一天:" + now.with(TemporalAdjusters.firstDayOfYear()));
    13. System.out.println("今年的最后一天:" + now.with(TemporalAdjusters.lastDayOfYear()));
    14. System.out.println("下一年的第一天:" + now.with(TemporalAdjusters.firstDayOfNextYear()));
    15. System.out.println("本月的第二个周五:" + now.with(TemporalAdjusters.dayOfWeekInMonth(2,DayOfWeek.FRIDAY)));
    16. System.out.println("两周后:" + now.with(TemporalAdjusters.ofDateAdjuster(date -> date.plusWeeks(2))));
    17. /*打印结果:
    18. 当前时间:2020-04-03T11:32:59.871======>FRIDAY
    19. 下一个周一:2020-04-06T11:32:59.871
    20. 上一个周一:2020-03-30T11:32:59.871
    21. 下一个周五:2020-04-03T11:32:59.871
    22. 上一个周五:2020-04-03T11:32:59.871
    23. 本月最后一个周五:2020-04-24T11:32:59.871
    24. 本月第一个周五:2020-04-03T11:32:59.871
    25. 本月第一天:2020-04-01T11:32:59.871
    26. 本月最后一天:2020-04-30T11:32:59.871
    27. 下月的第一天:2020-05-01T11:32:59.871
    28. 今年的第一天:2020-01-01T11:32:59.871
    29. 今年的最后一天:2020-12-31T11:32:59.871
    30. 下一年的第一天:2021-01-01T11:32:59.871
    31. 本月的第二个周五:2020-04-10T11:32:59.871
    32. 两周后:2020-04-17T11:32:59.871
    33. */

  • 相关阅读:
    Flink的检查点和保存点
    TV-SAM 新型零样本医学图像分割算法:GPT-4语言处理 + GLIP视觉理解 + SAM分割技术
    Linux —— 文件操作
    【最左侧冗余覆盖子串】python实现-附ChatGPT解析
    5.汉诺塔问题-(递归)
    酷晚报:6月24日Web3业界重点消息大汇总
    企业快速开发平台Spring Cloud+Spring Boot+Mybatis+ElementUI 之浅谈代码语言的魅力
    栈溢出原理
    创建一个简单的外卖订餐系统
    Linux系统调优详解(八)——vmstat查看系统整体运行状态
  • 原文地址:https://blog.csdn.net/javaeEEse/article/details/126816603