• java.time.LocalDateTime详解


    目录

    静态方法

    案例代码

    案例代码

    实例方法

    转换类方法

    获取类方法

    替换类方法

    判断类方法

    增加类方法

    减少类方法

    其他方法


    看到这篇文章的你还在用过期的时间java.util.Date吗,看完本章后,可以果断抛弃它了,因为java.time包下有他的替代品,而且功能比它更强大。

    学习一个API,主要学习如何使用,接下来进入正题,介绍LocalDateTime的常用方法及使用。(因为String是CharSequence最常用的实现类,本文将使用“字符串”代替“字符序列”)

    java.time.LocalDateTime是java.time.Temporal的实现类,用来表示包含年月日时分秒和纳秒的某个时间点,如:2022年9月30日9点08分55秒05纳秒。可以表示的时间范围是【-999999999年1月1日0时0分】到【999999999年12月31日23时59分59.99999999秒】

    静态方法

    1、static LocalDateTime now():获取当前时间,如:2022-09-30T09:44:35.750

    2、static LocalDateTime of():该方法用于指定 年 月 日 时 分 秒 纳秒 创建一个LocalDateTime对象,该方法有7个重载的方法

    static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute):指定年、月、日、时、分
    
    static LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute):指定年、月、日、时、分
    
    static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second):指定年、月、日、时、分、秒
    
    static LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute, int second):指定年、月、日、时、分、秒
    
    static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond):指定年、月、日、时、分、秒、纳秒
    
    static LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond):指定年、月、日、时、分、秒、纳秒
    
    static LocalDateTime of(LocalDate date, LocalTime time):通过指定的年月日(LocalDate )和时分秒(LocalTime )对象创建

    3、static LocalDateTime parse():通过解析字符串生成LocalDateTime对象,该方法可以通过传入一个DateTimeFormatter指定传入字符串的格式,如2022-09-30 09:27:50

    static LocalDateTime parse(CharSequence text):解析指定字符串生成LocalDateTime对象(LocalDateTime的字符串默认格式为2022-09-30T09:27:50)
    【源码注释】:Obtains an instance of LocalDateTime from a text string such as 2007-12-03T10:15:30
    static LocalDateTime parse(CharSequence text, DateTimeFormatter formatter):指定解析字符串的格式,通过创建DateTimeFormatter对象时指定

    案例代码

    1. public class LocalDateTimeExample {
    2. public static void main(String[] args) {
    3. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
    4. // 通过默认格式yyyy-MM-ddTHH:mm:ss解析
    5. System.out.println(LocalDateTime.parse("2022-09-30T08:42:30"));
    6. // 指定字符串格式为yyyyMMddHHmmss
    7. System.out.println(LocalDateTime.parse("20220930084455", formatter));
    8. }
    9. }

    实例方法

    转换类方法

    1、LocalDate toLocalDate():转为LocalDate对象

    2、LocalTime toLocalTime():转为LocalTime对象

    获取类方法

    1、int getDayOfYear():获取当前时间是今年的第几天

    2、int getDayOfMonth():获取当前时间是这个月的第几天

    3、DayOfWeek getDayOfWeek():获取当前时间是这周的星期几

    DayOfWeek是一个枚举,定义了每周的星期一到星期日
    1. public enum DayOfWeek implements TemporalAccessor, TemporalAdjuster {
    2. MONDAY, // 星期一
    3. TUESDAY, // 星期二
    4. WEDNESDAY, // 星期三
    5. THURSDAY, // 星期四
    6. FRIDAY, // 星期五
    7. SATURDAY, // 星期六
    8. SUNDAY; // 星期日
    9. }

    4、int getYear():获取年份

    5、int getMonthValue():获取月份

    6、Month getMonth():获取月份,该方法返回Month对象

    7、int getHour():获取小时

    8、int getMinute():获取分钟

    9、int getSecond():获取秒

    10、int getNano():获取纳秒

    替换类方法

    1、LocalDateTime withYear(int year):使用指定年替换原来的年份

    2、LocalDateTime withMonth(int month):使用指定月替换原来的月份

    3、LocalDateTime withHour(int hour):使用指定小时替换原来的小时

    4、LocalDateTime withMinute(int minute):使用指定分钟替换原来的分钟

    5、LocalDateTime withSecond(int second):使用指定秒替换原来的秒

    6、LocalDateTime withNano(int nanoOfSecond):使用指定纳秒替换原来的纳秒

    7、LocalDateTime withDayOfMonth(int dayOfMonth):替换原来月份的第几天

    8、LocalDateTime withDayOfYear(int dayOfYear):替换原来年份的第几天

    1. public class LocalDateTimeExample {
    2. public static void main(String[] args) {
    3. LocalDateTime localDate = LocalDateTime.now();
    4. System.out.println(localDate.withYear(5));
    5. System.out.println(localDate.withMonth(6));
    6. System.out.println(localDate.withHour(7));
    7. System.out.println(localDate.withMinute(8));
    8. System.out.println(localDate.withSecond(9));
    9. System.out.println(localDate.withNano(10));
    10. // 今天是2022年9月30号
    11. // 今天是本月第30天,改为第11天,即9月11号
    12. System.out.println(localDate.withDayOfMonth(11));
    13. // 今天是今年的第273天,改为第12天,即1月12号
    14. System.out.println(localDate.withDayOfYear(12));
    15. }
    16. }

    以上代码的运行结果为:注意观察年份、月份、小时、分钟秒和毫秒

    0005-09-30T10:36:42.285
    2022-06-30T10:36:42.285
    2022-09-30T07:36:42.285
    2022-09-30T10:08:42.285
    2022-09-30T10:36:09.285
    2022-09-30T10:36:42.000000010
    2022-09-11T10:36:42.285
    2022-01-12T10:36:42.285

    9、LocalDateTime with(TemporalField field, long newValue):指定时间域替换,关于TemporalField,您可以先通过TemporalField的简单介绍了解一下。

    例如:以下两个方法的调用是等效的。

    LocalDateTime dateTime = LocalDateTime.now();
    
    dateTime.withDayOfMonth(5);
    dateTime.with(ChronoField.DAY_OF_MONTH, 5);

    代码运行结果:

    2022-09-05T11:17:19.474
    2022-09-05T11:17:19.474

    判断类方法

    1、boolean isAfter(ChronoLocalDateTime other):判断是否在指定时间之后

    2、boolean isBefore(ChronoLocalDateTime other):判断是否在指定时间之前

    3、boolean isEqual(ChronoLocalDateTime other):判断和指定时间是否相等

    4、boolean isSupported(TemporalUnit unit):是否支持指定时间单位,源码中说明了LocalDateTime只支持以下单位

    NANOS
    MICROS
    MILLIS
    SECONDS
    MINUTES
    HOURS
    HALF_DAYS
    DAYS
    WEEKS
    MONTHS
    YEARS
    DECADES
    CENTURIES
    MILLENNIA
    ERAS

    5、boolean isSupported(TemporalField field):是否支持指定时间域,LocalDateTime只支持以下单位

    NANO_OF_SECOND
    NANO_OF_DAY
    MICRO_OF_SECOND
    MICRO_OF_DAY
    MILLI_OF_SECOND
    MILLI_OF_DAY
    SECOND_OF_MINUTE
    SECOND_OF_DAY
    MINUTE_OF_HOUR
    MINUTE_OF_DAY
    HOUR_OF_AMPM
    CLOCK_HOUR_OF_AMPM
    HOUR_OF_DAY
    CLOCK_HOUR_OF_DAY
    AMPM_OF_DAY
    DAY_OF_WEEK
    ALIGNED_DAY_OF_WEEK_IN_MONTH
    ALIGNED_DAY_OF_WEEK_IN_YEAR
    DAY_OF_MONTH
    DAY_OF_YEAR
    EPOCH_DAY
    ALIGNED_WEEK_OF_MONTH
    ALIGNED_WEEK_OF_YEAR
    MONTH_OF_YEAR
    PROLEPTIC_MONTH
    YEAR_OF_ERA
    YEAR
    ERA

    增加类方法

    1、LocalDateTime plusYears(long years):增加指定年数

    2、LocalDateTime plusMonths(long months):增加指定月数

    3、LocalDateTime plusWeeks(long weeks):增加指定周数

    4、LocalDateTime plusDays(long days):增加指定天数

    5、LocalDateTime plusHours(long hours):增加指定小时数

    6、LocalDateTime plusMinutes(long minutes):增加指定分钟数

    7、LocalDateTime plusSeconds(long seconds):增加指定秒数

    8、LocalDateTime plusNanos(long nanos):增加指定纳秒数

    9、LocalDateTime plus(TemporalAmount amountToAdd):增加指定的时间数量

    10、LocalDateTime plus(long amountToAdd, TemporalUnit unit):增加指定数量的时间单位

    1. public class LocalDateTimeExample {
    2. public static void main(String[] args) {
    3. LocalDateTime dateTime = LocalDateTime.now();
    4. System.out.println(dateTime);
    5. System.out.println(dateTime.plusYears(2));
    6. System.out.println(dateTime.plusMonths(2));
    7. System.out.println(dateTime.plusWeeks(2));
    8. System.out.println(dateTime.plusHours(2));
    9. System.out.println(dateTime.plusMinutes(2));
    10. System.out.println(dateTime.plusSeconds(2));
    11. System.out.println(dateTime.plusNanos(2));
    12. System.out.println(dateTime.plus(Period.ofDays(2)));
    13. System.out.println(dateTime.plus(2, ChronoUnit.DAYS));
    14. }
    15. }

    运行结果:

    2022-09-30T14:36:10.986
    2024-09-30T14:36:10.986
    2022-11-30T14:36:10.986
    2022-10-14T14:36:10.986
    2022-09-30T16:36:10.986
    2022-09-30T14:38:10.986
    2022-09-30T14:36:12.986
    2022-09-30T14:36:10.986000002
    2022-10-02T14:36:10.986
    2022-10-02T14:36:10.986

    减少类方法

    减少类方法plus()和plusXxxs()和增加类方法用法类似,这里就不介绍了。

    其他方法

    1、ValueRange range(TemporalField field):获取LocalDateTime支持的时间域的范围,如:

    LocalDateTime dateTime = LocalDateTime.now();
    // 一天有24小时,所以支持0~23
    System.out.println(dateTime.range(ChronoField.HOUR_OF_DAY)); // 0-23

    2、LocalDateTime truncatedTo(TemporalUnit unit):控制时间只显示到指定单位,TemporalUnit 请参考TemporalUnit简单介绍,最少会显示到分钟,更小的的单位不显示或显示为0,指定的单位最大为天,即最少可以显示为年月日(如:参数指定为分钟则秒不会显示,指定为小时,分钟会显示为00)

    1. public class LocalDateTimeExample {
    2. public static void main(String[] args) {
    3. LocalDateTime dateTime = LocalDateTime.now();
    4. System.out.println(dateTime.truncatedTo(ChronoUnit.DAYS));
    5. System.out.println(dateTime.truncatedTo(ChronoUnit.HOURS));
    6. System.out.println(dateTime.truncatedTo(ChronoUnit.MINUTES));
    7. System.out.println(dateTime.truncatedTo(ChronoUnit.SECONDS));
    8. System.out.println(dateTime.truncatedTo(ChronoUnit.MILLIS));
    9. }
    10. }

    以上代码运行结果为:

    2022-09-30T00:00
    2022-09-30T11:00
    2022-09-30T11:56
    2022-09-30T11:56:48
    2022-09-30T11:56:48.042

    3、String format(DateTimeFormatter formatter):将时间格式化为字符串,可以通过接收的DateTimeFormatter对象指定转换的日期字符串格式

    1. public class LocalDateTimeExample {
    2. public static void main(String[] args) {
    3. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
    4. LocalDateTime localDate = LocalDateTime.now();
    5. String format = localDate.format(formatter);
    6. System.out.println(format); // 20220930120236
    7. }
    8. }

    对比Date,java.util.Date通过java.text.SimpleDateFormat格式化

    public class LocalDateTimeExample {
        public static void main(String[] args) {
            SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
            Date date = new Date();
            String format = format.format(date);
    
            System.out.println(format);
        }
    }

    4、long until(Temporal endExclusive, TemporalUnit unit):计算指定时间离当前时间相差多少个指定的时间单位,如果指定时间endExclusive在当前时间之前,返回负数

    1. public class LocalDateTimeExample {
    2. public static void main(String[] args) {
    3. LocalDateTime dateTime = LocalDateTime.now();
    4. LocalDateTime time = LocalDateTime.of(2022, 9, 30, 14, 5, 50);
    5. long hours = dateTime.until(time, ChronoUnit.HOURS);
    6. long minutes = dateTime.until(time, ChronoUnit.MINUTES);
    7. long seconds = dateTime.until(time, ChronoUnit.SECONDS);
    8. System.out.println(dateTime);
    9. System.out.println(time);
    10. System.out.println(hours);
    11. System.out.println(minutes);
    12. System.out.println(seconds);
    13. }
    14. }

    以上代码运行结果为:

    2022-09-30T14:13:12.829
    2022-09-30T14:05:50
    0
    -7
    -442

    结果解析:运行时刻的时间为14:13:12.289,指定时间为14:05:50,两者相差了7分钟,没有问题,相差了(442 = 7 * 60 + 22)秒,即7分钟22秒,也没问题。


     

  • 相关阅读:
    树与图的深度优先遍历:AcWing 846. 树的重心
    微店关键词取商品列表API接口(item_search-根据关键词取商品列表API接口),微店API接口
    Linux基础——账号、群组管理
    微信小程序开发的OA会议之会议个人中心的页面搭建及模板,自定义组件的学习
    无重复字符的最长子串
    Python-正则表达式使用
    974. 和可被 K 整除的子数组
    浅析安防监控系统/AI视频智能分析算法:河道水文水位超标算法应用
    【机器学习】KNN算法介绍及py实现(详细代码,通俗易懂)
    Zynq UltraScale+ XCZU3EG 纯VHDL解码 IMX214 MIPI 视频,2路视频拼接输出,提供vivado工程源码和技术支持
  • 原文地址:https://blog.csdn.net/heyl163_/article/details/127117492