Java基础:JDK8之LocalDate,LocalTime,LocalDateTime使用

star2017 1年前 ⋅ 275 阅读

因为 Date 实在不方便,特别是在日期计算时难用,并且格式化是非线程安全的。

JDK 8 提供 LocalDate, LocalTime, LocalDateTime 可以更方便操作日期时间,是线程安全的。

在 JDK 8 出来之前,大多会使用第三方库 Joda 来操作日期时间,GitHub joda-time

国内工具类 Hutool 也提供了日期时间工具类,可以方便操作。

LocalDate

  1. LocalDate,LocalTime,LocalDateTime

    import java.time.*;
    import java.time.format.DateTimeFormatter;
    import java.time.temporal.ChronoField;
    import java.time.temporal.ChronoUnit;
    
    public class LocalDateDemo {
    
        public static void main(String[] args) {
    
            //2019-10-30
            LocalDate localDate = LocalDate.now();
            //2019-09-10
            LocalDate localDate1 = LocalDate.of(2019, 9, 10);
            //2019-10-30T19:58:29.519
            LocalDateTime localDateTime = LocalDateTime.now();
            //19:58:29.520
            LocalTime localTime = LocalTime.now();
    
            //获取年:2019
            int year = localDate.getYear();
            //获取年:2019
            int year1 = localDate.get(ChronoField.YEAR);
            //获取月:OCTOBER
            Month month = localDate.getMonth();
            //获取月:10
            int month1 = localDate.get(ChronoField.MONTH_OF_YEAR);
            //获取天:30
            int day = localDate.getDayOfMonth();
            //获取天:30
            int day1 = localDate.get(ChronoField.DAY_OF_MONTH);
            //获取星期:WEDNESDAY
            DayOfWeek dayOfWeek = localDate.getDayOfWeek();
            int dayOfMonth = localDate.getDayOfMonth();
            int dayOfYear = localDate.getDayOfYear();
            //获取星期:3
            int dayOfWeek1 = localDate.get(ChronoField.DAY_OF_WEEK);
    
            /**
             * LocalDateTime
             * 获取年月日时分秒,等于LocalDate+LocalTime
             */
            //2019-10-30T20:01:30.666
            LocalDateTime localDateTime0 = LocalDateTime.now();
            //2019-09-10T14:46:56
            LocalDateTime localDateTime1 = LocalDateTime.of(2019, Month.SEPTEMBER, 10, 14, 46, 56);
            //2019-10-30T20:01:30.665
            LocalDateTime localDateTime2 = LocalDateTime.of(localDate, localTime);
            //2019-10-30T20:01:30.665
            LocalDateTime localDateTime3 = localDate.atTime(localTime);
            //2019-10-30T20:01:30.665
            LocalDateTime localDateTime4 = localTime.atDate(localDate);
    
            /**
             * 获取LocalDate
             */
            //2019-10-30
            LocalDate localDate2 = localDateTime.toLocalDate();
    
            /**
             * 获取LocalTime
             */
            //20:03:45.084
            LocalTime localTime2 = localDateTime.toLocalTime();
    
            /**
             * 获取秒数
             */
            Instant instant = Instant.now();
            //秒数:1572437086
            long currentSecond = instant.getEpochSecond();
            //毫秒:1572437086198
            long currentMilli = instant.toEpochMilli();
            long nowMilli = System.currentTimeMillis();//更方便
    
            /**
             * 日期计算
             */
            //2019-09-10T14:46:56
            LocalDateTime localDateTime11 = LocalDateTime.of(2019, Month.SEPTEMBER, 10,
                    14, 46, 56);
            //增加一年:2020-09-10T14:46:56
            LocalDateTime localDateTime12 = localDateTime11.plusYears(1);
            //增加一年:2020-09-10T14:46:56
            LocalDateTime localDateTime13 = localDateTime11.plus(1, ChronoUnit.YEARS);
            //减少一个月:2019-08-10T14:46:56
            LocalDateTime localDateTime14 = localDateTime11.minusMonths(1);
            //减少一个月:2019-08-10T14:46:56
            LocalDateTime localDateTime15 = localDateTime11.minus(1, ChronoUnit.MONTHS);
    
            /**
             * 通过With修改值
             */
            //修改年2020:2020-10-30T20:11:54.369
            LocalDateTime localDateTime16 = localDateTime.withYear(2020);
            //修改为2022:2022-10-30T20:11:54.369
            LocalDateTime localDateTime17 = localDateTime.with(ChronoField.YEAR, 2022);
    
            /**
             * 格式化时间
             */
            //2019-09-10
            LocalDate localDate11 = LocalDate.of(2019, 9, 10);
            //20191030
            String s1 = localDate.format(DateTimeFormatter.BASIC_ISO_DATE);
            //2019-10-30
            String s2 = localDate.format(DateTimeFormatter.ISO_LOCAL_DATE);
            //自定义格式化
            DateTimeFormatter dateTimeFormatter =   DateTimeFormatter.ofPattern("dd/MM/yyyy");
            //30/10/2019
            String s3 = localDate.format(dateTimeFormatter);
    
            //解析时间
            //2019-09-10
            LocalDate localDate12 = LocalDate.parse("20190910", DateTimeFormatter.BASIC_ISO_DATE);
            //2019-09-10
            LocalDate localDate13= LocalDate.parse("2019-09-10", DateTimeFormatter.ISO_LOCAL_DATE);
    
        }
    }
    

入参与出参

这种方式在入参时,根据需要格式添加日期时间格式化注解(@DateTimeFormat),灵活。

@JsonDeserialize(using = LocalDateTimeDeserializer.class)  //application/json
@JsonSerialize(using = LocalDateTimeSerializer.class) //application/json
@DateTimeFormat(pattern = "yyyy-MM-dd")//入参转换,对 form 或 url 传进来的起效
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy/MM/dd")//输出转换
private LocalDate birthday;

但如果能统一日期或时间的入参格式,且不想在每个属性上添加日期格式化注解,则可以自定义转换器,并注册为 Bean,就可自动将日期或时间格式化传入,如下:

@Configuration
public class LocalDateTimeConverter {

    @Bean
    public Converter<String, LocalDate> localDateConverter() {
        return new Converter<String, LocalDate>() {
            @Override
            public LocalDate convert(String source) {
                return LocalDate.parse(source, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
            }
        };
    }

    @Bean
    public Converter<String, LocalDateTime> localDateTimeConverter() {
        return new Converter<String, LocalDateTime>() {
            @Override
            public LocalDateTime convert(String source) {
                return LocalDateTime.parse(source, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
            }
        };
    }
}

其它参考

  1. SpringMvc Json LocalDateTime 互转,form urlencoded @ModelAttribute 转换
更多内容请访问:IT源点

相关文章推荐
  • 该目录下还没有内容!

全部评论: 0

    我有话说: