Java8新的日期和时间

Java8新的日期和时间

一、Date 和Calender存在的问题

二、LocalDate 和 LocalTime

LocalDate 和LocalTime都是不可变对象。

2.1 创建并读取值LocalDate.of()

        // 创建一个LocalDate
        LocalDate date = LocalDate.of(2021, 9, 1);
        // 从系统中获取当前时间
        LocalDate nowDate = LocalDate.now();
        // 年份
        int year = date.getYear();
        // 月分
        Month month = date.getMonth();
        // 天
        int dayOfMonth = date.getDayOfMonth();
        // 星期几: WEDNESDAY
        DayOfWeek dayOfWeek = date.getDayOfWeek();
        // 9 月有31天
        int monthLen = date.lengthOfMonth();
        // 是否为闰年
        boolean leapYear = date.isLeapYear();

LocalTime:

        LocalTime time = LocalTime.of(23, 14, 13);
        int hour = time.getHour();
        int minute = time.getMinute();
        int second = time.getSecond();

2.2 通过TemporalField 结合get获取属性

        int year1 = date.get(ChronoField.YEAR);
        int month1 = date.get(ChronoField.MONTH_OF_YEAR);
        int day1 = date.get(ChronoField.DAY_OF_MONTH);

2.3 根据字符串创建日期和时间:parse

        LocalDate date = LocalDate.parse("2021-09-02");
        LocalTime time = LocalTime.parse("23:17:13");

三、LocalDateTime

LocalDateTime的设计是为了便于人使用

        LocalDateTime dateTime = LocalDateTime.of(2021, 9, 1, 21, 23, 12);
        LocalDate date = LocalDate.of(2021, 9, 1);
        LocalTime time = LocalTime.of(19, 23, 21);
        LocalDateTime dateTime1 = LocalDateTime.of(date, time);

四、Instant

Instant 的设计初衷是为了便于机器使用。从1970年1月1日午夜时分开始。它包含的是由秒和纳秒组成的数字

        Instant instant = Instant.ofEpochSecond(3);
        Instant instant1 = Instant.ofEpochSecond(3, 0);
        Instant instant2 = Instant.ofEpochSecond(2, 1_000_000_000);
        Instant instant3 = Instant.ofEpochSecond(3, -1_000_000_000);

五、Duration和Period,时间区间

5.1 Duration

duration 主要用于秒和纳秒衡量时间的长短。

        Instant instant1 = Instant.ofEpochSecond(3);
        Instant instant2 = Instant.ofEpochSecond(5);
        Duration duration1 = Duration.between(instant1, instant2);

        LocalDateTime dateTime1 = LocalDateTime.of(2021, 9, 8, 9, 23, 12);
        LocalDateTime dateTime2 = LocalDateTime.of(2021, 12, 12, 9, 23, 12);
        Duration duration = Duration.between(dateTime1, dateTime2);

5.2 Period

period 可以得到两个 LocalDate 的时长

        LocalDate date1 = LocalDate.of(2021, 9, 13);
        LocalDate date2 = LocalDate.of(2021, 10, 13);
        Period period = Period.between(date1, date2);

六、操纵、解析、格式化

6.1 日期和时间的相加减

(1) 以绝对的方式修改日期
        LocalDate date1 = LocalDate.now();
        LocalDate date2 = date1.withYear(2020);
        LocalDate date3 = date2.withDayOfMonth(25);
        LocalDate date4 = date3.with(ChronoField.MONTH_OF_YEAR, 9);
(2) 以相对的方式修改日期
        LocalDate date = LocalDate.now();
        // 加
        LocalDate date2 = date.plusWeeks(1);
        // 减
        LocalDate date3 = date.minusYears(3);
        // 通用 运算
        LocalDate date4 = date.plus(6, ChronoUnit.DAYS);
(3) 自定义的运算:TemporalAdjuster
        LocalDate date = LocalDate.now();
        LocalDate date1 = date.with(TemporalAdjusters.nextOrSame(DayOfWeek.MONDAY));
        LocalDate date2 = date1.with(TemporalAdjusters.lastDayOfMonth());

下一个工作日:

    private static TemporalAdjuster nextWorkingDay() {
        return temporal->{
            DayOfWeek dayOfWeek = DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));
            int addToAdd = 1;
            if (dayOfWeek==DayOfWeek.FRIDAY) {
                addToAdd = 3;
            }else if (dayOfWeek==DayOfWeek.SATURDAY) {
                addToAdd = 4;
            }
            return temporal.plus(addToAdd, ChronoUnit.DAYS);
        };
    }

有个工厂方法:TemporalAdjusters.ofDateAdjuster

    private static TemporalAdjuster nextWorkingDay2() {
        return TemporalAdjusters.ofDateAdjuster(temporal->{
            DayOfWeek dayOfWeek = DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));
            int addToAdd = 1;
            if (dayOfWeek==DayOfWeek.FRIDAY) {
                addToAdd = 3;
            }else if (dayOfWeek==DayOfWeek.SATURDAY) {
                addToAdd = 4;
            }
            return temporal.plus(addToAdd, ChronoUnit.DAYS);
        });
    }

6.2 日期和时间格式化DateTimeFormatter

        LocalDate date = LocalDate.now();
        String format = date.format(DateTimeFormatter.ISO_LOCAL_DATE);
        String format1 = date.format(DateTimeFormatter.BASIC_ISO_DATE);

自定义格式化:

        LocalDate date = LocalDate.now();
        String format = date.format(DateTimeFormatter.ISO_LOCAL_DATE);
        String format1 = date.format(DateTimeFormatter.BASIC_ISO_DATE);
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
        String format2 = date.format(dateTimeFormatter);
        System.out.println(format2);

6.3 LocalDateTime 和 Instant的转换

        LocalDateTime dateTime = LocalDateTime.now();
        ZoneId zoneId = ZoneId.systemDefault();
        Instant instant = dateTime.atZone(zoneId).toInstant();

        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zoneId);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值