• 【Java8】java.time 根据日期获取年初年末、月初月末、日初日末


    记录日常开发中Java 8时间API的常用的日期转换代码。

    注意:下文中,都以LocalDateTime为例,在不声明的情况下如下方法一般都适用于Java8中LocalDate、LocalDateTime、OffsetDateTime、ZonedDateTime等时间类,不适用某些类时会在文中有提醒。



    年初年末

    1. 使用TemporalAdjusters工具类。
    LocalDateTime.now().with(TemporalAdjusters.firstDayOfYear()); // 2023-01-01T14:11:27.062
    
    • 1

    1. 使用withadjustInto方法,通过TemporalAdjuster实现类(如MonthDay)来调整时间。后面的调整日期、时分秒都可以借鉴下面的方法来实现。
    MonthDay lastDayOfMonth = MonthDay.of(12, 31);
    LocalDateTime with = LocalDateTime.now().with(lastDayOfMonth);
    // 等价于
    LocalDateTime adjustInto = (LocalDateTime) lastDayOfMonth.adjustInto(LocalDateTime.now());
    
    • 1
    • 2
    • 3
    • 4

    TemporalAdjusters的方法:

    • TemporalAdjusters.firstDayOfYear():将月份和日期调整至1月1日
    • TemporalAdjusters.lastDayOfYear():将月份和日期调整至12月31日
    • TemporalAdjusters.firstDayOfMonth():将月份调整至当月的第一天(1)
    • TemporalAdjusters.lastDayOfMonth():将月份调整至当月的最后一天(28-31)
    • TemporalAdjusters.firstDayOfNextMonth():将月份和日期调整为下个月的第一天
    • TemporalAdjusters.firstDayOfNextYear():将年份和日期调整为下一年的第一天




    月初月末

    1. 还是使用TemporalAdjusters
    LocalDateTime.now().with(TemporalAdjusters.lastDayOfMonth()); // 2023-10-31T14:34:01.958
    
    • 1

    1. 通过ChronoField类实现
    LocalDateTime with = LocalDateTime.now().with(ChronoField.DAY_OF_MONTH, 1);
    
    • 1

    1. 通过YearMonth类实现

    与计算年初、年末、月初不同,月末是一个浮动值(28-31),需要根据是否是闰年,是年份的第几个月来最终确认月末值,手工实现比较麻烦。不过Java8中有很多类已经完成了这类计算。

    使用YearMonth计算月初月末计算:

    YearMonth yearMonth = YearMonth.now();
    // 当然月初也可以用这种形式,不过也挺麻烦的
    LocalDate startOfMonth = yearMonth.atDay(1);
    // 月末
    LocalDate endOfMonth = yearMonth.atEndOfMonth();
    
    • 1
    • 2
    • 3
    • 4
    • 5

    YearMonth无法直接得到结果,需要转换一次:

    LocalDateTime now = LocalDateTime.now();
    // 计算月初
    LocalDateTime with = now.with(YearMonth.from(now).atDay(1));
    // 计算月末
    LocalDateTime adjustInto = (LocalDateTime) YearMonth.from(now).atEndOfMonth().adjustInto(now);
    
    • 1
    • 2
    • 3
    • 4
    • 5




    日初日末

    日初日末也没那么花俏了,值都是固定不变的,日初时间就是00:00:00.000,日末就是23:59:59.999,withadjustInto方法随便用,能达成目标就行。

    1. 使用LocalDate.atStartOfDay()方法,不过只有转换日初,没有转换日末的atEndOfDay() 这种方法
    // 日初
    LocalDateTime startOfDay = LocalDateTime.now().toLocalDate().atStartOfDay();
    LocalDateTime startOfDay1 = LocalDate.now().atStartOfDay();
    
    • 1
    • 2
    • 3

    1. 使用LocalDate.atTime()设置具体时间。
    // 日初
    LocalDateTime min = LocalDate.now().atTime(LocalTime.MIN); // 2023-09-22T00:00 | min = 00:00
    // 日末
    LocalDateTime max = LocalDate.now().atTime(LocalTime.MAX); // 2023-09-22T23:59:59.999999999 | max = 23:59:59.999999999
    
    • 1
    • 2
    • 3
    • 4

    1. 其他方法。
    // 当然也可以这样
    LocalDateTime min = LocalDateTime.now().with(LocalTime.MIN);
    // 这样
    LocalDateTime atDate = LocalTime.MAX.atDate(LocalDateTime.now().toLocalDate());
    // 甚至你也可以直接设置时间
    LocalDateTime with = LocalDateTime.now().with(LocalTime.of(0, 0, 0));
    LocalDateTime adjustInto = (LocalDateTime) LocalTime.of(23, 59, 59).adjustInto(LocalDateTime.now());
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7




    简单总结日常用到的时间转换方法,欢迎补充评论,谢谢!

  • 相关阅读:
    System Generator学习——将代码导入System Generator
    打家劫舍Java
    基于最近电平逼近的开环MMC逆变器Simulink仿真模型
    [ISITDTU 2019]EasyPHP
    20221205英语学习
    C++ 丑数
    大学生抗疫逆行者网页作业 感动人物HTML网页代码成品 最美逆行者dreamweaver网页模板 致敬疫情感动人物网页设计制作
    C# 线程与任务
    中枢神经系统的网状结构,网状神经系统的特征
    软件设计模式系列之二十五——访问者模式
  • 原文地址:https://blog.csdn.net/HO1_K/article/details/133857076