java8日期时间API的一些使用 | 转字符串 | 格式化等

Posted 做猪呢,最重要的是开森啦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java8日期时间API的一些使用 | 转字符串 | 格式化等相关的知识,希望对你有一定的参考价值。

1. LocalDateTime转字符串:

LocalDateTime是日期时间,也可以分别从中获取日期和时间

  • 转字符串主要是format方法,内置有多种DateTimeFormatter
  • LocalTime和 LocalDate转字符也是一样的
        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.println(localDateTime);      // 2022-11-09T09:08:38.944
        String basicDate = localDateTime.format(DateTimeFormatter.BASIC_ISO_DATE);
        System.out.println(basicDate);          //  20221109
        String isoLocalDateTime = localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
        System.out.println(isoLocalDateTime);   //  2022-11-09T09:08:38.944
        String isoDate = localDateTime.format(DateTimeFormatter.ISO_DATE);
        System.out.println(isoDate);            //  2022-11-09
        String isoTime = localDateTime.format(DateTimeFormatter.ISO_TIME);
        System.out.println(isoTime);            //  09:08:38.944
        String formatTime = localDateTime.format(DateTimeFormatter.ofPattern("HH:mm:ss"));
        System.out.println(formatTime);         //  09:08:38
        String formatTime1 = localDateTime.format(DateTimeFormatter.ofPattern("HH:mm:ss:SSS"));
        System.out.println(formatTime1);        //  09:08:38:944    和ISO_TIME区别在于毫秒显示是自定义的冒号

2. 字符串转LocalDateTime、LocalDate:

  • 转字符串主要是parse方法,内置有多种DateTimeFormatter
  • 转换时字符串要和对应的格式保持一致,特别是带不带T的日期时间
        String dateTimeStr = "2022-11-09T09:08:38.944";
        LocalDateTime parse = LocalDateTime.parse(dateTimeStr, DateTimeFormatter.ISO_LOCAL_DATE_TIME);
        System.out.println(parse);              //   2022-11-09T09:08:38.944    如果字符时间带T,用ISO_LOCAL_DATE_TIME
        String dateTimeStr1 = "2022-11-09 09:08:38.944";
        LocalDateTime parse1 = LocalDateTime.parse(dateTimeStr1, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
        System.out.println(parse1);             //  2022-11-09T09:08:38.944 如果字符时间带T,用自定义的

        String dateTimeStr2 = "2022-11-09";
        LocalDate parse2 = LocalDate.parse(dateTimeStr2, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        System.out.println(parse2);             //  2022-11-09
        LocalDate parse3 = LocalDate.parse(dateTimeStr2, DateTimeFormatter.ISO_DATE);
        System.out.println(parse3);             //  2022-11-09

3. 时间戳与LocalDateTime、LocalDate互转:

  • 转时间戳通过toEpochSecond或toEpochMilli,区别在于要不要毫秒
  • 转LocalDateTime通过ofEpochSecond或ofEpochMilli
        String dateTimeStr = "2022-11-09T09:08:38.944";
        LocalDateTime parse = LocalDateTime.parse(dateTimeStr, DateTimeFormatter.ISO_LOCAL_DATE_TIME);
        System.out.println(parse);              //   2022-11-09T09:08:38.944    如果字符时间带T,用ISO_LOCAL_DATE_TIME
        String dateTimeStr1 = "2022-11-09 09:08:38.944";
        LocalDateTime parse1 = LocalDateTime.parse(dateTimeStr1, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
        System.out.println(parse1);             //  2022-11-09T09:08:38.944 如果字符时间带T,用自定义的

        String dateTimeStr2 = "2022-11-09";
        LocalDate parse2 = LocalDate.parse(dateTimeStr2, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        System.out.println(parse2);             //  2022-11-09
        LocalDate parse3 = LocalDate.parse(dateTimeStr2, DateTimeFormatter.ISO_DATE);
        System.out.println(parse3);             //  2022-11-09

        System.out.println("===================================================================");
        String dateTimeStr4 = "2022-11-09T09:08:38.944";
        LocalDateTime parse4 = LocalDateTime.parse(dateTimeStr4, DateTimeFormatter.ISO_LOCAL_DATE_TIME);
        
        long epochSecond = parse4.toEpochSecond(ZoneOffset.ofHours(8));
        System.out.println(epochSecond);        //  1667956118 只保留到秒的时间戳
        
        LocalDateTime toLocalDateTime = Instant.ofEpochSecond(epochSecond).atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
        System.out.println(toLocalDateTime);    //  时间戳转LocalDateTime,保留到秒
        
        long toEpochMilli = parse4.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
        System.out.println(toEpochMilli);       //  1667956118944 保留到毫秒的时间戳
        
        LocalDateTime toLocalDateTime1 = Instant.ofEpochMilli(toEpochMilli).atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
        System.out.println(toLocalDateTime1);   //  时间戳转LocalDateTime,保留到毫秒
        
        LocalDate localDate = Instant.ofEpochMilli(toEpochMilli).atZone(ZoneOffset.ofHours(8)).toLocalDate();
        System.out.println(localDate);          // 时间戳只转成日期

4. 一些特殊的开始时间和最后时间获取:

  • 主要通过TemporalAdjusters来获取
		DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime dateTime = LocalDateTime.parse(LocalDateTime.now().format(pattern), pattern); // 去除毫秒
        // 当月第一天0时0分0秒 与 当月最后一天最后一秒
        LocalDateTime firstDayTime = dateTime.with(TemporalAdjusters.firstDayOfMonth()).withHour(0).withMinute(0).withSecond(0);
        System.out.println(firstDayTime);       //  2022-11-01T00:00
        LocalDateTime lastDayTime = dateTime.with(TemporalAdjusters.lastDayOfMonth()).withHour(23).withMinute(59).withSecond(59);
        System.out.println(lastDayTime);        //  2022-11-30T23:59:59

        // 当年第一天0时0分0秒 与 当年最后一天最后一秒
        LocalDateTime firstDayTimeYear = dateTime.with(TemporalAdjusters.firstDayOfYear()).withHour(0).withMinute(0).withSecond(0);
        System.out.println(firstDayTimeYear);       //  2022-01-01T00:00
        LocalDateTime lastDayTimeYear = dateTime.with(TemporalAdjusters.lastDayOfYear()).withHour(23).withMinute(59).withSecond(59);
        System.out.println(lastDayTimeYear);        //  2022-12-31T23:59:59

        // 获取当天的起始时间与结束时间
        dateTime.withHour(0).withMinute(0).withSecond(0);
        LocalDateTime firstTimeOfDay = dateTime.withHour(0).withMinute(0).withSecond(0);
        System.out.println(firstTimeOfDay);         //  2022-11-09T00:00
        LocalDateTime lastTimeOfDay = dateTime.withHour(23).withMinute(59).withSecond(59);
//        LocalDateTime lastTimeOfDay = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);   //  2022-11-09T23:59:59.999999999
        System.out.println(lastTimeOfDay);          //  2022-11-09T23:59:59

5. 日期运算:

  • 晚多少时间用plus相关方法,提前多少时间用minus相关方法
        LocalDateTime now = LocalDateTime.parse(LocalDateTime.now().format(pattern), pattern); // 去除毫秒
        System.out.println(now);                //  规定时间:2022-11-09T10:24:57
        System.out.println(now.plusHours(5));   //  比规定时间晚5h    2022-11-09T15:24:57
        System.out.println(now.plusDays(5));    //  比规定时间晚5d    2022-11-14T10:24:57
        System.out.println(now.minusHours(5));  //  比规定时间提前5h   2022-11-09T05:24:57
        System.out.println(now.minusDays(5));   //  比规定时间提前5d   2022-11-04T10:24:57

6. LocalDateTime时区转换:

 时区转换也就是时间的加减,可以使用加减的API来进行,也可以采用如下时区的方法来转换

北京时间转UTC时间:北京时间 = UTC0 时间 + 8 h

        LocalDateTime localDateTime1 = LocalDateTime.parse(LocalDateTime.now().format(pattern), pattern); // 去除毫秒 2022-11-09T10:44:31
        LocalDateTime time = localDateTime1.atZone(ZoneId.from(ZoneOffset.ofHours(8))).withZoneSameInstant(ZoneOffset.UTC).toLocalDateTime();
        System.out.println(time);   // 2022-11-09T02:44:31
  • atZone当前时间时区
  • withZoneSameInstant 要转换的时区

以上是关于java8日期时间API的一些使用 | 转字符串 | 格式化等的主要内容,如果未能解决你的问题,请参考以下文章

[转] Java8 日期/时间(Date Time)API指南

转Java 8新特性:新的时间和日期API

JAVA8新的时间与日期 API- 传统时间格式化的线程安全问题

Java8:18个日期处理的实践

《Java8实战》读书笔记11:Java8中新的日期时间API

《Java8实战》读书笔记11:Java8中新的日期时间API