Java8 LocalDate、LocalDateTime、LocalTime、Instant

2022年11月21日07:55:38

Java8日期时间API,新增了LocalDate、LocalDateTime、LocalTime等线程安全类,下面简单介绍他们的使用及Date与LocalDate互转。

 1、LocalDate、LocalDateTime、LocalTime

LocalDate 是日期:2022-09-21

LocalDateTime 是日期和时间:2022-09-21 15:20:10

LocalTime 是时间:15:20:16

定义当前时间使用自带的now() 方法:

LocalDate.now();

LocalDateTime.now();

LocalTime.now();

定义指定时间:

LocalTime time = LocalTime.of(11,11,11);
LocalDate date = LocalDate.of(2022,9,21);
LocalDateTime lt = LocalDateTime.of(date, time);

时间与字符串的相互转化
DateTimeFormatter 将时间转成字符串,或将字符串转成时间

定义:df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

时间转字符串:

df.format(LocalDateTime.now())

字符串转化成时间:

LocalDateTime.parse("2022-09-21 15:31:19",df)

日期及时间的的转换也可以使用相同的方式。

两个时间的比较,返回结果true/false

isAfter();

isBefore()

LocalDateTime.now().isAfter(dt2);

例子1:

   /**
     * LocalDate 与 String 之间的转换
     */
    @Test
    public void localDateToString(){
        LocalDate today = LocalDate.now();
        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String dateStr = today.format(fmt);
        System.out.println("dateStr:"+dateStr);

        String str = "2022-09-22";
        //指定转换格式
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        //进行转换
        LocalDate date = LocalDate.parse(str, dateTimeFormatter);
        System.out.println("date:"+date);

    }

控制台输出:

例子2:

    @Test
    public void  testDate(){
        Date date = new Date();
        LocalDate localDate = LocalDate.now();
        System.out.println("localDate:"+localDate);
        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.println("localDateTime:"+localDateTime);
        LocalTime localTime= LocalTime.now();
        System.out.println("localTime:"+localTime);
        //Date转LocalDate
        System.out.println("Date转LocalDate:");
        System.out.println("DateToLocalDate:"+date2LocalDate(date));
        //LocalDate转Date
        System.out.println("LocalDate转Date:");
        System.out.println("LocalDateToDate:"+localDate2Date(localDate));
    }
    /**
     * Date转LocalDate
     * @param date
     */
    public static LocalDate date2LocalDate(Date date) {
        if(null == date) {
            return null;
        }
        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
    }
    /**
     * LocalDate转Date
     * @param localDate
     * @return
     */
    public static Date localDate2Date(LocalDate localDate) {
        if (null == localDate) {
            return null;
        }
        ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.systemDefault());
        return Date.from(zonedDateTime.toInstant());
    }

控制台输出:

 2、Instant

    @Test
    public void testInstant(){
        Instant now = Instant.now();
        System.out.println("现在时间:"+now);
        /**
         * 注意:通过这种方式获取的时间戳与北京时间相差8个时区,需要修正为北京时间,
         * 通过查看源代码发现Instant.now()使用等是UTC时间Clock.systemUTC().instant()。LocalDate、LocalDateTime
         * 的now()方法使用的是系统默认时区 不存在Instant.now()的时间问题。
         * 解决方法:增加8个小时
         */
        Instant now1 = Instant.now().plusMillis(TimeUnit.HOURS.toMillis(8));
        System.out.println("修正后的现在时间:"+now1);

        //Instant获取long类型的10位秒数、13位毫秒数
        Instant now2 = Instant.now().plusMillis(TimeUnit.HOURS.toMillis(8));
        System.out.println("秒数:"+now2.getEpochSecond());
        System.out.println("毫秒数:"+now2.toEpochMilli());

        //LocalDateTime输出毫秒数的方式,比Instant多一步转换
        LocalDateTime localDateTime = LocalDateTime.now();
        //LocalDateTime转Instant
        Instant localDateTime2Instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
        System.out.println("LocalDateTime 毫秒数:"+localDateTime2Instant.toEpochMilli());
    }

控制台输出:

  • 作者:与物为春
  • 原文链接:https://blog.csdn.net/weixin_43824829/article/details/126973254
    更新时间:2022年11月21日07:55:38 ,共 2930 字。