• JDK1.8中的时间处理API


    相比于JDK1.8之前的SimpleDateFormat以及Calendar等API带来的易误用、线程不安全等问题,JDK1.8提供了LocalDate,LocalTime,LocalDateTime三个主要的类进行时间处理,设计和使用基本与JodaTime相似。

    基本用法

        public static void main(String[] args) {
            //只包含日期
            LocalDate now = LocalDate.now();
            System.out.println("日期:" + now);
            LocalDate date = LocalDate.of(2020, 12, 1);
            System.out.println("自由组装日期:" + date);
            System.out.println("年:" + date.getYear() + ";月:" + date.getMonthValue() + ";日:" + date.getDayOfMonth());
            //with指定某个属性
            System.out.println("指定1997年的今天:" + now.withYear(1997));
            System.out.println("----------------------------");
    
            //只包含了时间
            LocalTime time = LocalTime.now();
            System.out.println("时间:" + time);
            System.out.println("带格式的时间" + time.format(DateTimeFormatter.ISO_TIME));
            System.out.println("自由组装日期:" + LocalTime.of(14, 32, 21));
            System.out.println("时:" + time.getHour() + ";分:" + time.getMinute() + ";秒:" + time.getSecond());
            System.out.println("----------------------------");
    
            //包含了日期和时间
            LocalDateTime dateTime = LocalDateTime.now();
            System.out.println("默认的ISO标准格式:" + dateTime.format(DateTimeFormatter.ISO_DATE_TIME));
            //常用的yyyy-MM-dd HH:mm:ss格式
            System.out.println(dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
            System.out.println("----------------------------");
    
            //时间的后延、前移
            System.out.println(dateTime.plusDays(3).format(DateTimeFormatter.ISO_DATE_TIME));
            System.out.println(dateTime.minusHours(8).format(DateTimeFormatter.ISO_DATE_TIME));
            //时间的比较,前后、相等、是否闰年...
            LocalDateTime minusHours = dateTime.minusHours(1);
            System.out.println(dateTime + "比" + minusHours + "更晚:" + dateTime.isAfter(minusHours));
            //日期和时间类型转换为另外两种类型
            LocalDate toLocalDate = dateTime.toLocalDate();
            System.out.println("被转换的日期:" + toLocalDate);
            LocalTime toLocalTime = dateTime.toLocalTime();
            System.out.println("被转换的时间:" + toLocalTime);
            System.out.println("----------------------------");
    
            //字符串转换时间
            System.out.println(LocalDate.parse("2011-03-02").getDayOfMonth());
            System.out.println(LocalDateTime.parse("2020-03-01T12:01:01").getMonthValue());
        }

    结果:

    使用TemporalAdjusters指定特殊时间

        public static void main(String[] args) {
            //使用TemporalAdjusters指定特殊时间
            LocalDate now = LocalDate.now();
            System.out.println("匹配日期 " + now + " -- " + now.getDayOfWeek());
            System.out.println("-------------------------------------------");
            //匹配日期当月第一天、最后一天
            System.out.println("匹配日期当月第一天 " + now.with(TemporalAdjusters.firstDayOfMonth()));
            System.out.println("匹配日期当月最后一天 " + now.with(TemporalAdjusters.lastDayOfMonth()));
            //匹配日期下月的第一天
            System.out.println("匹配日期下月的第一天 " + now.with(TemporalAdjusters.firstDayOfNextMonth()));
    
            //匹配日期当年第一天、最后一天
            System.out.println("匹配日期当年第一天 " + now.with(TemporalAdjusters.firstDayOfYear()));
            System.out.println("匹配日期当年最后一天" + now.with(TemporalAdjusters.lastDayOfYear()));
            //匹配日期下年的第一天
            System.out.println("匹配日期下年的第一天 " + now.with(TemporalAdjusters.firstDayOfNextYear()));
            //一个月中的第一个、最后一个星期几
            System.out.println("匹配日期当月中的第一个星期一 " + now.with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)));
            System.out.println("匹配日期当月中的最后一个星期一 " + now.with(TemporalAdjusters.lastInMonth(DayOfWeek.MONDAY)));
            //匹配日期当月的第几个星期几
            System.out.println("匹配日期当月的第2个星期一 " + now.with(TemporalAdjusters.dayOfWeekInMonth(2, DayOfWeek.MONDAY)));
    
            //匹配日期(now)过后(不含匹配日期当天)的第一个星期几
            System.out.println("匹配日期当月的下一个星期一(不含今日) " + now.with(TemporalAdjusters.next(DayOfWeek.MONDAY)));
            //匹配日期(now)过后(含匹配日期当天)的第一个星期几
            System.out.println("匹配日期当月的下一个星期一(含今日) " + now.with(TemporalAdjusters.nextOrSame(DayOfWeek.MONDAY)));
            //匹配日期(now)之前(不含匹配日期当天)的第一个星期几
            System.out.println("匹配日期当月的上一个星期一(不含今日) " + now.with(TemporalAdjusters.previous(DayOfWeek.MONDAY)));
            //匹配日期(now)之前(不含匹配日期当天)的第一个星期几
            System.out.println("匹配日期当月的上一个星期一(不含今日) " + now.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)));
        }

    结果:

    TemporalAdjuster接口处理自定义逻辑

        public static void main(String[] args) {
            //使用TemporalAdjuster接口自定义匹配时间
            //2022-03-14
            LocalDate now = LocalDate.now();
            LocalDate nextWeekDay = now.with(new TemporalAdjuster() {
                @Override
                public Temporal adjustInto(Temporal temporal) {
                    LocalDate inputDate = (LocalDate) temporal;
                    if (inputDate.getDayOfWeek() == DayOfWeek.FRIDAY) {
                        return inputDate.plusDays(3);
                    } else if (inputDate.getDayOfWeek() == DayOfWeek.SATURDAY) {
                        return inputDate.plusDays(2);
                    } else {
                        return inputDate.plusDays(1);
                    }
                }
            });
            System.out.println(nextWeekDay);
            //2022-03-15
        }

    Instant(略)

    主要是用来获取时间戳,和从计算机元年到现在的时间间隔秒数/纳秒数,一来涉及到时区问题,二来System.currentMilliSeconds()本身也能获取到时间戳,此部分就略过。

    Duration与Period计算时间间隔

        public static void main(String[] args) {
            //Duration计算时间差--LocalDateTime
            LocalDateTime now = LocalDateTime.now();
            LocalDateTime yesterday = now.minusDays(1);
            System.out.println(Duration.between(yesterday, now).toHours());
    
            //Duration计算时间差--LocalTime
            LocalTime time = LocalTime.now();
            LocalTime hoursAgo = time.minusHours(1);
            System.out.println(Duration.between(hoursAgo, time).toMinutes());
    
            //计算日期差
            LocalDate date = LocalDate.now();
            LocalDate tenThousandDaysAgo = date.minusDays(10000);
            Period period = Period.between(tenThousandDaysAgo, date);
            System.out.println("万日之前距今已相隔" + period.getYears() + "年" + period.getMonths() + "月" + period.getDays() + "日");
        }

    24
    60
    万日之前距今已相隔27年4月15日

    ZonedDate、ZonedTime、ZonedDateTime

    这个三个类方法及用法和 LocalDate、 LocalTime、 LocalDateTime 基本一样,只不过ZonedDate,ZonedTime、ZonedDateTime 这三个带有当前系统的默认时区的时间表示类。相关的还有ZoneID类。

  • 相关阅读:
    js语言结构小记(一)
    jquery插件:fancybox
    转载(深刻地了解到了js数组是引用类型)
    sqlite 页面结构分析
    有限状态机(FSM)的设计与实现(二)
    sqlite源码中的一个潜在Bug
    一种整数数据压缩存储的算法实现
    构建自己的内存池(一)
    sqlite Btree结构分析
    构建自己的内存池(二)
  • 原文地址:https://www.cnblogs.com/bruceChan0018/p/16004296.html
Copyright © 2020-2023  润新知