Java

JDK8新增日期类

  • 概述
    • Java 8 开始,java.time包提供了新的日期和时间API,主要设计的类型有:
    • JDK 8 新增日期类
      • LoacalDate:不包含具体的时间和日期
      • LocalTime:不含日期的时间
      • LocalDateTime : 包含了日期及时间.
      • Instant : 代表的是时间戳
      • DureTimeFormatter 用于做时间的格式化和解析的
      • Duration : 用于计算两个"时间"间隔
      • Period : 用于计算两个"日期"间隔
  • 新增的API严格区分了时刻.本地时间,并且,对日期和时间进行运算更加方便
  • 其次,新API的类型几乎全部是不变类型(和String的使用类似),可以放心使用不必担心被修改.

LocalDate,LocalTime,LocalDateTime

  • team分别表示日期,时间,日期时间对象,他们的类的实例是不可改变的对象
  • 他们三者构建对象和API都是通用的
构建对象的方式
方法名 说明
public static xxxx now(); 静态方法,根据当前时间创建对象 LocalDate LocalDate = LocalDate.now();
public static xxxx of(); 静态方法,指定日期/时间创建对象 LocalDate LocalDate = LocalDate.now();

三者方法相近,用法相同

获取信息的API
方法名 说明
public int getYear() 获取年
public int getMonthValue() 获取月份(1-12)
public int getDayOfMonth 获取月中第几天乘法
public int getDayOfYear() 获取年中第几天
public DayOfWeek getDayOfWeek() 获取星期
转相关的API
  • LocalDateTime可以转换成LocalDate 和LocalTime

  • 方法名 说明
    public LocalDate toLocalDate() 转换成一个LocalDate对象
    public LocalTime toLocalTime() 转换成一个LocalTime对象
  • LocalDateTime综合了LocalDate 和 LocalTime 里面的方法,

  • 这些方法返回的是一个新的实例引用,业务LocalDateTime , LocalDate , LocalTime都是不可变的

  • 方法名 说明
    plusDays,plusWeeks,plusMonths,plusYears 向当前LocalDate对象添加几天,几周,几个月,几年
    minusDays,minusWeeks,minusMonths,minusYeats 从当前LocakDate对象减去几天,几周,几个月,几年
    withDayOfMonth,withDayOfYear,withMonth,withYear 将月份天使,年份天数,月份,年份,修改为指定的值并返回新的LocalDate对象
    isBefore ,isAfter 比较两个LocalDate

Instant时间戳

  • JDK8获取时间戳特别简单,且功能丰富.Instant类由一个静态的工厂方法now()可以返回当前时间戳

    package com.yu.SingleInstance;
    
    import java.time.Instant;
    import java.util.Date;
    
    public class InstantTest {
        public static void main(String[] args) {
            Instant instant = Instant.now();
            System.out.println("当前时间是:"+instant);
            Date  date = Date.from(instant);
            System.out.println("当前时间是:"+date);
            instant = date.toInstant();
            System.out.println(instant);
        }
    }
    
    • 运行结果
    • com.yu.SingleInstance.InstantTest
      当前时间是:2022-05-14T09:21:17.980Z
      当前时间是:Sat May 14 17:21:17 CST 2022
      2022-05-14T09:21:17.980Z
  • 时间戳是包含日期和时间的,与java.util.Date很类似,事实上Instant就是类是JDK8以前的Date

  • Instant和Date这两个类可以进行转换

DateTimeFormatter

日期时间格式化

  • 在JDK8中,引入一个全新的日期与时间格式期DateTimeFormantter

  • 正反都能调用format方法

  • package com.yu.SingleInstance;
    
    import java.time.LocalDateTime;
    import java.time.format.DateTimeFormatter;
    
    public class DateTimeFormatTest {
        public static void main(String[] args) {
            //本地此刻 日期时间 对象
            LocalDateTime ldt = LocalDateTime.now();
            System.out.println(ldt);
            //解析/格式化器
            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss EEE a");
            //正向格式化
            System.out.println(dtf.format(ldt));
            //反向格式化
            System.out.println(ldt.format(dtf));
            //解析字符串时间
            DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            //解析指定时间字符串成为本地日期时间对象
            LocalDateTime ldt1  =LocalDateTime.parse("2019-11-11 11:11:11",dtf1);
            System.out.println(ldt1);
            System.out.println(ldt1.getDayOfYear());
            System.out.println(ldt1.getDayOfMonth());
            System.out.println(ldt1.getDayOfWeek());
        }
    }
    
  • 结果

2022-05-14T17:35:53.979
2022-05-14 17:35:53 星期六 下午
2022-05-14 17:35:53 星期六 下午
2019-11-11T11:11:11
315
11
MONDAY

Duration/Period

Period
  • 在Java 8 中,我们可以使用以下类来计算日期间隔差异:java.time.Period
  • 主要是Period类的方法getYears(),getMonthos()和getDays() 来计算,只能精确到年月日
  • 用于LocalDate之间的比较
Duration

用于计算两个"时间"间隔

package com.yu.SingleInstance;

import java.time.Duration;
import java.time.LocalDateTime;

public class DurationTest {
    public static void main(String[] args) {
        //本地日期时间对象
        LocalDateTime today = LocalDateTime.now();
        System.out.println(today);
        //出生日期时间对象
        LocalDateTime birthDate = LocalDateTime.of(2001,03,8,02,14,39,39);
        System.out.println(birthDate);
        Duration duration = Duration.between(birthDate,today);
        System.out.println(duration.toDays());//两个时间差的天数
        System.out.println(duration.toHours());//两个时间差的小时数
        System.out.println(duration.toMinutes());//两个时间差的分钟数
        System.out.println(duration.toMillis());//两个时间差的毫秒数
        System.out.println(duration.toNanos());//两个时间差的秒数
        System.out.println(185705/24.0);
    }
}
2022-05-14T20:04:58.918
2001-03-08T02:14:39.000000039
7737
185705
11142350
668541019917
668541019917999961
7737.708333333333

ChronoUnit

可用于在单个时间单位内测量一段时间,这个工具类最全的了,可以用于比较所有的时间单位

包装类

  • 基本数据类型对应的引用类型

  • 基本数据类型 引用数据类型
    byte Byte
    short Short
    int Integer
    long Long
    char Character
    float Float
    double Double
    boolean Boolean
为什么提供包装类
  • Java为了实现一切皆对象,为8种基本呢类型提供了对应的引用类型
  • 后面的集合和泛型其实也只能支持包装类型,不支持基本数据类型
自动装箱,自动拆箱

自动装箱: 基本类型的数据和变量可以直接赋值给包装类型的变量

自动拆箱:包装类型的变量可以直接赋值给基本数据类型的变量

包装类的特有功能
  • 包装类的变量默认值可以是null,容错率更高
  • 可以把基本类型的数据转成字符串类型(用处不大)
    • 调用toString()方法得到基本字符串结果
    • 调用Integer.toString(基本类型数据)
  • 可以把字符串类型的数值转换成真实的数据类型(真的很有用)
    • integer.parseint("字符串类型的整数")
    • Double.parseDouble("字符串类型的小数")
    • 一般不用
    • 用.valueOf()方法

 posted on 2022-05-14 20:33  yulll  阅读(39)  评论(0)    收藏  举报