java8日期常用API,日期详解

一、前言

1、java8之前的日期类缺点。

1、util包下的Date和Calendar类不支持时区,线程不安全。
2、格式化类java.text.SimpleDateFormat线程不安全。
3、API调用繁琐。

二、java8新增日期类

1、java8新增的日期类都再java.time包中,时间日期类包含LocalDate、LocalTime、LocalDateTime、Instant、Duration以及Period。日期格式化类DateTimeFormatter

2、新的时区类java.time.ZoneId替代原有的java.util.TimeZone;ZoneId对象可以通过ZoneId.of()方法创建,也可以通过ZoneId.systemDefault()获取系统默认时区


1、java8日期类介绍

1、LocalTime

LocalTime表示一个具体的时间(时,分,秒,毫秒),是一个不可变的线程安全的实现,时间更精确。该类的构造器是私有的,因此无法直接实例化。

 @Test
    public void localTimeMethod() {
        //获取当前系统时间
        LocalTime time = LocalTime.now();
        System.out.println(time);

        //根据提供的时间获取LocalTime对象
        LocalTime time2 = LocalTime.of(16, 32, 35);
        System.out.println(time2);

        //计算两个时间之间的差值(单位取决于传入ChronoUnit:小时,分钟,秒)
        //传入的时间减去当前时间
        long exp = time.until(time2, ChronoUnit.SECONDS);
        System.out.println(exp);


        //在指定的时间基础上增加一个时间值(单位取决于传入ChronoUnit:小时,分钟,秒)
        time = time.plus(10, ChronoUnit.MINUTES);
        System.out.println(time);

        //在指定的时间基础上减去一个时间值(单位取决于传入ChronoUnit:小时,分钟,秒)
        time = time.minus(10, ChronoUnit.MINUTES);
        System.out.println(time);
    }

2、LocalDate

LocalDate用于表示一个具体的日期对象(年,月,日),是一个不可变的线程安全实现,可以通过其实例获取每个字段信息。

 @Test
    public void localDateMethod() {
        LocalDate date = LocalDate.now();
        System.out.println(date);

        //通过给定日期值构建一个LocalDate
        LocalDate date2 = LocalDate.of(2022, 10, 01);
        System.out.println(date2);

        Period until = date.until(date2);
        System.out.println("相隔天数:" + until.getDays());
        System.out.println("相隔月份:" + until.getMonths());
        System.out.println("相隔年数:" + until.getYears());

        System.out.println("--------------");
        //获取两个日期的差值,单位取决于ChronoUnit(年,月,日)
        long days = date.until(date2, ChronoUnit.YEARS);
        System.out.println("相隔年数:" + days);
        days = date.until(date2, ChronoUnit.MONTHS);
        System.out.println("相隔月数:" + days);
        days = date.until(date2, ChronoUnit.DAYS);
        System.out.println("相隔天数:" + days);

        System.out.println("年份:" + date.getYear());
        System.out.println("月份:" + date.getMonth());
        System.out.println("日期:" + date.getDayOfMonth());
        System.out.println("本周的第几天:" + date.getDayOfWeek().getValue());
        System.out.println("今年的第几天:" + date.getDayOfYear());
    }

3、LocalDateTime

LocalDateTime常用方法:
LocalTime、LocalDate两个日期时间处理类分别只能够用于独立处理时间或者日期,如果需要同时进行处理则可以使用LocalDateTime,是一个不可变的线程安全的日期时间处理类

 @Test
    public void localDateTimeMethod() {
        //获取系统时间(包含日期和时间)
        LocalDateTime now = LocalDateTime.now();
        System.out.println(now);

        //将时间对象分别转换为LocalDate和LocalTime
        LocalDate localDate = now.toLocalDate();
        LocalTime localTime = now.toLocalTime();
        System.out.println(localDate+"----"+localTime);
        //根据提供的日期和时间构建LocalDateTime对象
        LocalDateTime tm = LocalDateTime.of(2022, 10, 01, 8, 22, 11);
        System.out.println(tm);

        long until = now.until(tm, ChronoUnit.DAYS);
        System.out.println("相差天数:" + until);
        until = now.until(tm, ChronoUnit.HOURS);
        System.out.println("相差小时数:" + until);
        until = now.until(tm, ChronoUnit.MINUTES);
        System.out.println("相差分钟数:" + until);
        until = now.until(tm, ChronoUnit.SECONDS);
        System.out.println("相差秒钟数:" + until);

        //如何将LocalDateTime转换为java.util.Date
        Instant instant = now.atZone(ZoneId.systemDefault()).toInstant();
        Date date = Date.from(instant);
        System.out.println(date);
    }

4、DateTimeFormatter

日期显示格式进行处理


 @Test
    public void localDateTimeFormatterMethod() {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        //将LocalDateTime转为字符串
        LocalDateTime now = LocalDateTime.now();
        String s = now.format(dateTimeFormatter);
        System.out.println(s);

        //将字符串转为LocalDateTime
        String time = "2022-08-08 16:48:36";
        LocalDateTime localDateTime = LocalDateTime.parse(time, dateTimeFormatter);
        System.out.println(localDateTime);
    }

2、常用日期API

1、格式化时间戳(指定格式和时间戳)

 /**
  *时间戳格式化年月日,指定时区个格式
  * @return
  */
 public static String demo3() {
     long time = System.currentTimeMillis();
     DateTimeFormatter ftf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
     //ZoneId.systemDefault();ZoneId.of("UTC");ZoneId.of("UTC+08:00");ZoneId.of("Asia/Shanghai")
     return ftf.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneId.of("Asia/Shanghai")));
 }

2、日期字符串转时间戳

/**
 * 日期字符串转时间戳
 * @return
 */
public static long demo4(){
    String strTime = "2022-01-25 15:40:38";
    DateTimeFormatter ftf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    LocalDateTime parse = LocalDateTime.parse(strTime, ftf);
    return LocalDateTime.from(parse).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
}

3、获取当天开始和结束数据,格式(yyyy-MM-dd’T’HH:mm:ss’Z’)

    public static void main(String[] args) throws Exception {
        //2023-11-20T00:00:00Z
        String format1 = LocalDateTime.of(LocalDate.now(), LocalTime.MIN).format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'"));
        System.out.println(format1);
        //2023-11-20T23:59:59Z
        String format2 = LocalDateTime.of(LocalDate.now(), LocalTime.MAX).format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'"));
        System.out.println(format2);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北漂IT民工_程序员_ZG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值