您的位置:首页 > 编程语言 > Java开发

Java基础编程-JDK8新增日期时间API

2020-03-26 07:44 531 查看

本文全文参考 https://www.bilibili.com/video

日期时间API的迭代:

  • 第一代:jdk 1.0 Date类
  • 第二代:jdk 1.1 Calendar类,一定程度上替换Date类
  • 第三代:jdk 1.8 提出了新的一套API

前两代存在的问题举例:

  • 可变性:像日期和时间这样的类应该是不可变的。
  • 偏移性:Date中的年份是从1900开始的,而月份都从0开始。
  • 格式化:格式化只对Date用,Calendar则不行。
  • 此外,它们也不是线程安全的;不能处理闰秒等。

java 8 中新的日期时间API涉及到的包

本地日期(LocalDate)、本地时间(LocalTime)、本地日期时间的使用(LocalDateTime)

4.1 说明:

  • ① 分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。它们提供了简单的本地日期或时间,并不包含当前的时间信息,也不包含与时区相关的信息。
  • ② LocalDateTime相较于LocalDate、LocalTime,使用频率要高
  • ③ 类似于Calendar

4.2 常用方法:

// now():获取当前的日期、时间、日期+时间
LocalDate localDate = LocalDate.now(); // 2020-03-24
LocalTime localTime = LocalTime.now(); // 10:25:45.991
LocalDateTime localDateTime = LocalDateTime.now(); // 2020-03-24T10:25:45.991

// of():设置指定的年、月、日、时、分、秒。没有偏移量
LocalDateTime of = LocalDateTime.of(2020, 3, 24, 10, 41, 59);
System.out.println(of); // 2020-03-24T10:41:59

// getXxx()
localDateTime.getDayOfWeek();//TUESDAY
localDateTime.getDayOfMonth(); //24
localDateTime.getDayOfYear(); //84
localDateTime.getMinute(); // 46
localDateTime.getHour(); // 10
localDateTime.getMonth(); //MARCH
localDateTime.getMonthValue(); // 3
localDateTime.getYear(); // 2020

// withXxx()-----不可变性
// 将月份天数、年份天数、月份、年份修改为指定的值并返回新的对象
LocalDate localDate1 = localDate.withDayOfMonth(23); // 设置月份天数
System.out.println(localDate); //2020-03-24 原来的值没有改变
System.out.println(localDate1); //2020-03-23
LocalDateTime localDateTime1 = localDateTime.withHour(11); // 设置小时数

// plusXxx()----不可变性
// 向当前对象添加几天、几周、几个月、几年、几小时
LocalDateTime localDateTime2 = localDateTime.plusMonths(3);

// minusXxx()----不可变性
// 从当前对象减去几月、几周、几天、几年、几小时
LocalDateTime localDateTime3 = localDateTime.minusHours(12);

时间点:Instant

5.1 说明:

  • ① 时间线上的一个瞬时点。 概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC开始的秒数。)
  • 类似于 java.util.Date类

5.2 常用方法:

// now()
Instant instant = Instant.now();
System.out.println(instant); // 2020-03-24T03:12:11.347Z

// atOffset()
OffsetDateTime offset = instant.atOffset(ZoneOffset.ofHours(8));
System.out.println(offset); // 2020-03-24T11:14:16.681+08:00

// toEpochMilli()
long epochMilli = instant.toEpochMilli();
System.out.println(epochMilli); // 1585019727730

// ofEpochMilli() 根据毫秒数创建Instant对象
Instant instant1 = Instant.ofEpochMilli(1585019727730L);
System.out.println(instant1);

日期时间格式化类:DateTimeFormatter

6.1 说明:

  • ① 格式化或解析日期、时间
  • ② 类似于SimpleDateFormat

6.2 常用方法:

  • ① 实例化方式: 预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
  • 本地化相关的格式。如:ofLocalizedDateTime(FormatStyle.LONG)
  • 自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
  • ② 常用方法:
  • 特别的:自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
  • //预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
    DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
    LocalDateTime localDateTime = LocalDateTime.now();
    System.out.println(localDateTime); // // 2020-03-24T11:28:20.175
    String format = formatter.format(localDateTime);
    System.out.println(format); // 2020-03-24T11:28:20.175
    // 解析:字符串--》日期
    TemporalAccessor parse = formatter.parse("2020-03-24T11:28:20.175");
    System.out.println(parse); // {},ISO resolved to 2020-03-24T11:28:20.175
    
    // 本地化相关的格式。如:ofLocalizedDateTime(FormatStyle.LONG)
    DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
    String format1 = formatter1.format(localDateTime);
    System.out.println(format1); // 2020年3月24日 上午11时33分31秒
    
    // *重点:自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
    DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
    //格式化
    String str4 = formatter3.format(LocalDateTime.now());
    System.out.println(str4);//2019-02-18 03:52:09
    
    //解析
    TemporalAccessor accessor = formatter3.parse("2019-02-18 03:52:09");
    System.out.println(accessor);

    其他时间API

    • 点赞
    • 收藏
    • 分享
    • 文章举报
    辣鸡程序猿Jerry 发布了9 篇原创文章 · 获赞 0 · 访问量 80 私信 关注
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: