日期时间API

本文共--字 阅读约--分钟 | 浏览: -- Last Updated: 2022-06-25

JDK8.0之前的日期API

import org.junit.Test;
import java.util.Date;

public class DateTimeTest {

  /**
   * 1、System.currentTimeMillis()
   */
  @Test
  public void test1() {
    // 返回时间戳:当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差
    long time = System.currentTimeMillis();
    System.out.println(time);
  }

  /**
   * 2、java.util.Date类 => import java.util.Date;
   */
  @Test
  public void test2() {
    // 未传参 就是创建当前时间的Date对象
    Date date1 = new Date();
    System.out.println(date1.toString()); // Wed Jan 12 21:06:26 CST 2022
    System.out.println(date1.getTime()); // 时间戳

    // 传入一个时间戳,传入年月日不建议使用
    Date date2 = new Date(1550306204104L);
    System.out.println(date2.toString()); // Sat Feb 16 16:36:44 CST 2019
  }

  /**
   * 3、java.sql.Date对应数据库中的日期类型的变量
   */
  @Test
  public void test3() {
    java.sql.Date date3 = new java.sql.Date(1550306204104L);
    System.out.println(date3); // 2019-02-16

    // sql.Date -> util.Date
    // 子类转父类
    Date date4 = new java.sql.Date(1550306204104L);

    // util.Date -> sql.Date
    // 父类转子类 强转
    java.sql.Date date5 = (java.sql.Date) date4;

    // api转换 父类转子类
    Date date6 = new Date();
    java.sql.Date date7 = new java.sql.Date(date6.getTime());
  }

  /**
   * 4、SimpleDateFormat
   *
   * parse可能会报异常,所以要throw,因为可能传入的字符串不能被解析
   */
  @Test
  public void test4() throws ParseException {
    // SimpleDateFormat对日期Date类的格式化和解析
    // 1. 格式化:日期 -> 字符串

    SimpleDateFormat s = new SimpleDateFormat();
    Date date = new Date();
    System.out.println(date); // Thu Jan 13 22:48:21 CST 2022

    String dateStr = s.format(date);
    System.out.println(dateStr); // 2022/1/13 下午10:48

    // 2. 解析:字符串 -> 日期
    // 要求字符串有一样的格式 format返回的格式,默认格式如下
    String str = "2022/1/13 下午10:48";
    Date date2 = s.parse(str);
    System.out.println(date2);

    // 如果想改变日期字符串的格式传递给parse
    // 使用带参的构造 SimpleDateFormat,这样parse也将只解析这样格式的字符串
    SimpleDateFormat s2 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    Date date3 = s2.parse("2020-01-01 11:22:00");
    System.out.println(date3);
  }


  /**
   * 5、Calendar 是一个抽象类
   */
  @Test
  public void test5() {
    // 1、创建其子类 GregorianCalendar 的对象,或者调用getInstance()方法
    Calendar c = Calendar.getInstance();
    System.out.println(c.getClass()); // class java.util.GregorianCalendar

    // 2、常用方法
    // get
    // 获取当前时间的一些数据,参数都定义在Calendar上的静态变量上
    // 此例中的Calendar.DAY_OF_MONT(API还有很多) 代表获取Calendar这个日期(默认是当天)是这个月的第几天
    int i = c.get(Calendar.DAY_OF_MONTH); // 13
    System.out.println(i);

    // set
    c.set(Calendar.DAY_OF_MONTH, 14);
    System.out.println(c.get(Calendar.DAY_OF_MONTH)); // 14, Calendar的代表的日期也被修改了

    // add
    c.add(Calendar.DAY_OF_MONTH, 3); // 可以是负数
    System.out.println(c.get(Calendar.DAY_OF_MONTH)); // 17

    // getTime: Calendar -> Date;
    Date date = c.getTime();
    System.out.println(date); // Mon Jan 17 23:12:34 CST 2022

    // setTime: Date -> Calendar
    c.setTime(new Date());
    System.out.println(c.get(Calendar.DAY_OF_MONTH)); // 13
  }
}

JDK8中新增的API

import org.junit.Test;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

public class DateTimeTest2 {
  /**
   * java.time.LocalDate
   * java.time.LocalTime
   * java.time.LocalDateTime
   */
  @Test
  public void test() {
    // now() 获取当前日期、时间、日期+时间
    LocalDate date = LocalDate.now();
    LocalTime time = LocalTime.now();
    LocalDateTime dateTime = LocalDateTime.now();

    System.out.println(date); // 2022-01-13
    System.out.println(time); // 23:24:27.812445
    System.out.println(dateTime); // 2022-01-13T23:24:27.812484

    // of() 设定指定的年月日时分秒 没有秒的偏移量
    LocalDateTime dateTime1 = dateTime.of(2020, 1, 1, 11, 30, 30);
    System.out.println(dateTime1); // 2020-01-01T11:30:30

    // getXxx()
    System.out.println(dateTime.getDayOfMonth()); // 13 获取日期是当月的哪一天
    System.out.println(dateTime.getMonth()); // JANUARY 获取月份
    System.out.println(dateTime.getMinute()); // 获取分钟

    // 体现了不可变性
    // withXxx 相当于 setXxx
    LocalDate date1 = date.withDayOfMonth(22); // 改变day
    System.out.println(date); // 2022-01-13 没有被改变
    System.out.println(date1); // 2022-01-22 被改变后的

    // 加 plusXxx 也是不可变性的体现
    LocalDate date2 = date.plusMonths(3);
    System.out.println(date); // 2022-01-13 没有被改变
    System.out.println(date2); // 2022-04-13

    // 减 minusXxx
    LocalDate date3 = date.minusDays(3);
    System.out.println(date); // 2022-01-13 没有被改变
    System.out.println(date3); // 2022-01-10
  }
}

Instant

Instant,时间线上的一个瞬时点,可能被用来记录应用程序中的事件时间戳。

public class DateTimeTest2 {
  @Test
  public void test3() {
    Instant instant = Instant.now();
    System.out.println(instant); // 2022-01-15T06:16:24.064238Z 格林威治时区时间
    OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
    System.out.println(offsetDateTime); // 2022-01-15T14:17:31.842500+08:00 东8区时间,北京时间

    // toEpochMilli(): 获取时间戳
    long mill = instant.toEpochMilli();
    System.out.println(mill); // 1642227569475

    // 通过给定的毫秒数 获取Instant实例
    Instant instant1 = Instant.ofEpochMilli(1642227569475L);
    System.out.println(instant1); // 2022-01-15T06:19:29.475Z 格林威治时间
  }
}

日期时间格式化

public class DateTimeTest2 {
  @Test
  public void test4() {
    // 1、预定义的标准格式,ISO_LOCAL_DATE_TIME、 ISO_LOCAL_DATE 、ISO_LOCAL_TIME
    DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;

    // 格式化:日期 -> 字符串
    LocalDateTime localDateTime = LocalDateTime.now();
    String str1 = formatter.format(localDateTime);
    System.out.println("格式化前:" + localDateTime); // 2022-01-15T14:25:02.637571
    System.out.println("格式化后:" + str1); // 2022-01-15T14:25:02.637571
    // 结果一样,但是 LocalDateTime 转换成了 String

    // 解析:字符串 -> 日期
    TemporalAccessor parse = formatter.parse("2022-01-15T14:25:02.637571");
    System.out.println(parse); // {},ISO resolved to 2022-01-15T14:25:02.637571

    // 2、本地化相关的格式 ofLocalizedDateTime()
    // 参数 FormatStyle.LONG /  FormatStyle.MEDIUM / FormatStyle.SHORT 适用于 LocalDateTime
    DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
    // DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG).withZone(ZoneId.systemDefault());


    // 格式化
    String s2 = formatter1.format(localDateTime);
    System.out.println(s2);
    // SHORT:2022/1/15 下午2:35
    // MEDIUM: 2022年1月15日 下午2:34:53
    // LONG: 2022年1月15日 CST 下午2:40:16 不适用withZone,而传参FormatStyle.LONG在会报错 跟jdk版本相关

    // 本地化相关的格式 ofLocalizedDate()
    // 参数 FormatStyle.Full / FormatStyle.LONG /  FormatStyle.MEDIUM / FormatStyle.SHORT 适用于 LocalDate

    // 3、自定义格式
    // ofPattern()
    DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss");
    // 格式化
    String s3 = formatter2.format(localDateTime);
    System.out.println(s3);// 2022-01-15 14:44:58

    // 解析
    TemporalAccessor parse1 = formatter2.parse("2022-01-15 14:44:58");
    System.out.println(parse1); // {WeekBasedYear[WeekFields[SUNDAY,1]]=2022, MonthOfYear=1, DayOfMonth=15},ISO resolved to 14:44:58
  }
}

日期类之间的转换