java8日期常用API,日期详解

首页 / 新闻资讯 / 正文

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

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

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

 @TestpublicvoidlocalTimeMethod(){//获取当前系统时间         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用于表示一个具体的日期对象(年,月,日),是一个不可变的线程安全实现,可以通过其实例获取每个字段信息。

 @TestpublicvoidlocalDateMethod(){         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,是一个不可变的线程安全的日期时间处理类

 @TestpublicvoidlocalDateTimeMethod(){//获取系统时间(包含日期和时间)         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

日期显示格式进行处理

  @TestpublicvoidlocalDateTimeFormatterMethod(){         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   */publicstatic Stringdemo3(){      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  */publicstatic longdemo4(){     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();}