转载

java8新特性之新时间日期API

特性:速度更快、代码更少,强大的Stream API、便于并行、最大化减少空指针异常 Optional。核心为Lambda表达式和Stream API,总共分为以下几个部分:

  1. Lambda表达式
  2. 函数式接口
  3. 方法引用与构造器引用
  4. Stream API
  5. 接口中的默认方法与静态方法
  6. 新时间日期API
  7. 其他新特性

时间日期API

Java8之前的库对日期和时间的支持并不是很好,比如SimpleDateFormat不支持多线程,为了解决这些问题,Java8引入了一套全新的时间日期API,位于java.time包,更加系统规范,更好用。

时间和日期

日期和时间,以 LocalDateTime 为例

@Test
public void test01() {
    // 调用静态方法now 就可以获取 LocalDateTime实例
    LocalDateTime localDateTime = LocalDateTime.now();
    // 获取当前日期 2019-11-28T23:57:03.073
    System.out.println(localDateTime);
    // 当前年份 // 2019
    System.out.println(localDateTime.getYear());
    // 当前月 返回英文单词 NOVEMBER
    System.out.println(localDateTime.getMonth());
    // 当前月的 数字 11
    System.out.println(localDateTime.getMonthValue());
    // 当前月的第几天 28
    System.out.println(localDateTime.getDayOfMonth());
    // 当前周 周几 返回 英文单词 THURSDAY
    System.out.println(localDateTime.getDayOfWeek());
    // 当前年  第多少天 332
    System.out.println(localDateTime.getDayOfYear());
    // 当前 时 23
    System.out.println(localDateTime.getHour());
    // 当前 分 57
    System.out.println(localDateTime.getMinute());
    // 当前 秒 3
    System.out.println(localDateTime.getSecond());
}

时间戳 Instant

计算机识别的时间,(UTC时间)以Unix元年 1970年1月1日 00:00:00.000到某个时间之间的毫秒值。

整个地球分为二十四时区,每个时区都有自己的本地时间。

在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal Time Coordinated)。

UTC与格林尼治平均时(GMT, Greenwich Mean Time)一样,都与英国伦敦的本地时相同。

@Test
public void test02() {
    // 默认获取 UTC时区 2019-11-28T15:59:23.429Z
    Instant instant = Instant.now();
    System.out.println(instant);
    // 偏移量8个小时 东八区时间 2019-11-28T23:59:23.429+08:00
    OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
    System.out.println(offsetDateTime);
    // 获取 1970年1月1日 00:00:00.000 到现在的毫秒值 1574956763429
    System.out.println(instant.toEpochMilli());
    // 获取 1970年1月1日 00:00:00.000  加60秒的时间 1970-01-01T00:01:00Z
    Instant instant2 = Instant.ofEpochSecond(60);
    System.out.println(instant2);
}

时间间隔

@Test
public void test03() {
    // Instant间隔
    Instant instant1 = Instant.now();
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    Instant instant2 = Instant.now();

    Duration duration1 = Duration.between(instant1, instant2);
    // 秒 
    System.out.println(duration1.toMillis());

    //  LocalDateTime间隔
    LocalDateTime localDateTime1 = LocalDateTime.now();
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    LocalDateTime localDateTime2 = LocalDateTime.now();
    Duration duration2 = Duration.between(localDateTime1, localDateTime2);
    // 秒 
    System.out.println(duration2.toMillis());

}

日期间隔

@Test
public void test04() {
    // 设置一个具体时间 2016-09-18
    LocalDate localDate1 = LocalDate.of(2016, 9, 18);
    System.out.println(localDate1);
    // 当前时间 2019-11-29
    LocalDate localDate2 = LocalDate.now();
    System.out.println(localDate2);
    // 相隔的时间 从年开始 几年几个月几天
    Period period = Period.between(localDate1, localDate2);
    // [Years, Months, Days] P3Y2M11D
    System.out.println(period);
    //  11天
    System.out.println(period.getDays());
    //  2个月
    System.out.println(period.getMonths());
    //  3年
    System.out.println(period.getYears());
}

TemporalAdjuster 时间校正器

@Test
public void test05() {
    //2019-11-29T00:07:33.689
    LocalDateTime localDateTime1 = LocalDateTime.now();
    System.out.println(localDateTime1);

    //  指定 具体时间 这个月几号 2019-11-10T00:07:33.689
    LocalDateTime localDateTime2 = localDateTime1.withDayOfMonth(10);
    System.out.println(localDateTime2);

    //  指定 具体时间 下一个周一 2019-12-02T00:07:33.689
    LocalDateTime localDateTime3 = localDateTime1.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
    System.out.println(localDateTime3);

    //   计算下一个工作日
    //   with(TemporalAdjuster temporalAdjuster) 可以传入lambda表达式
    LocalDateTime localDateTime4 = localDateTime1.with((t) -> {
        LocalDateTime localDateTime = (LocalDateTime) t;
        //   获取周几
        DayOfWeek dayOfWeek = localDateTime.getDayOfWeek();
        //    如果是周五  加3天
        if (dayOfWeek.equals(DayOfWeek.FRIDAY)) {
            //  加3天
            return localDateTime.plusDays(3);
            //  如果是周六  加2天

        } else if (dayOfWeek.equals(DayOfWeek.SATURDAY)) {
            return localDateTime.plusDays(2);
            //    其他情况  加1天

        } else {
            return localDateTime.plusDays(1);

        }
    });
    // 2019-12-02T00:07:33.689
    System.out.println(localDateTime4);

}

时间格式化

@Test
public void test06() {
    //   默认提供的解析格式 DateTimeFormatter.ISO_DATE
    DateTimeFormatter formatter1 = DateTimeFormatter.ISO_DATE_TIME;

    LocalDateTime localDateTime = LocalDateTime.now();
    //        2019-11-29T00:08:32.92
    String timeStr1 = formatter1.format(localDateTime);
    System.out.println(timeStr1);


    // 自定义解析格式
    DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
    //       格式化字符串 2019年11月29日 00:08:32
    String timeStr2 = formatter2.format(localDateTime);
    System.out.println(timeStr2);

    LocalDateTime localDateTime2 = LocalDateTime.parse(timeStr2, formatter2);
    //       解析为LocalDateTime格式  2019-11-29T00:08:32
    System.out.println(localDateTime2);
}

时区

@Test
 public void test07() {

     Set<String> set = ZoneId.getAvailableZoneIds();
     //  输出所有的时区
     for (String zone : set) {
         System.out.println(zone);
     }

     LocalDateTime localDateTime = LocalDateTime.now(ZoneId.of("Asia/Aqtau"));
     // Asia/Aqtau 时区 的当前时间 2019-11-28T21:10:39.353
     System.out.println(localDateTime);

     LocalDateTime localDateTime2 = LocalDateTime.now();
     // 构建带有时区的时间 上海  2019-11-29T00:10:39.359+08:00[Asia/Shanghai]
     ZonedDateTime zonedDateTime = localDateTime2.atZone(ZoneId.of("Asia/Shanghai"));

     System.out.println(zonedDateTime);


 }
原文  https://blackcat.top/2019/11/28/A009/
正文到此结束
Loading...