Java8日期时间API,2021Java进阶学习资料

  • 将日期格式化为字符串的方法

  • 解析字符串为日期时间的方法

  • TemporalAdjuster接口 - 时间调节器

  • Duration类 - 用于计算两个“时间”间隔的类

  • Period类 - 用于计算两个“日期”间隔的类

  • Instant 时间戳类

  • Clock - 时钟系统

  • ZonedDate、ZonedTime、ZonedDateTime - 带时区的日期时间

    • ZoneId - 世界时区类
  • DateTimeFormatter类 - 用于解析日期字符串和格式化日期输出

    • 格式化输出 & 字符串解析
  • 使用`SimpleDateFormat`的正确姿势

  • Java8 日期时间类与Date类的相互转化

    • Date和Instant互相转换
  • Date与LocalDateTime互相转换

  • Date与LocalDate互相转换

  • Date转换为LocalTime

  • GregorianCalendar与ZonedDateTime相互转换

  • Java 8日期时间类图

  • Java 8时间日期 API 中的设计模式

  • Java 8的日期时间API总结

Java 8以前日期时间API存在的问题


作为开发者,经常需要处理日期时间。在Java 8以前,相信你对 java.util.Datejava.util.Calendarjava.util.GregoiranCalendarjava.text.SimpleDateFormat 这四大类非常熟悉,它们分别用于处理日期、日历、公历、日期时间格式化。

这四个类有好多陷阱和坑,比如

  1. 非线程安全:这四大类都不是线程安全的。开发者在使用这些类时必须自己处理多线程并发问题。

  2. 设计不佳 :一方面日期和日期格式化分布在多个包中;另一方面,java.util.Date 的默认日期为1970年1月1日,没有统一性。而且 Date 类也缺少直接操作日期的相关方法。

  3. 时区处理困难:因为设计不佳,开发人员不得不编写大量代码来处理时区问题。

  4. 还有其它一些问题,如Calendar类月份从零开始计算等。

面对种种问题,Java 8 终于重新设计了所有日期时间、日历及时区相关的 API。并把它们都统一放置在 java.time 包和子包下。并作出了以下改进

  1. 新的日期时间 API 是线程安全的。不仅没有 setter 方法,而且任何对实例的变更都会返回一个新的实例,保证原来的实例不变。

  2. 新的日期时间 API 提供了大量的方法,用于修改日期时间的各个部分,并返回一个新的实例。

  3. 借鉴了第三方日期时间库joda很多的优点。

  4. 在时区方面,新的日期时间 API 引入了 ( domain ) 这个概念。

同时 Java 8 还针对原来复杂的 API 进行重新组合和拆分,分成了好多个类。

关于时间和时区


GMT和UTC

GMT,即格林尼治标准时间,也就是世界时。GMT的正午是指当太阳横穿格林尼治子午线(本初子午线)时的时间。但由于地球自转不均匀不规则,导致GMT不精确,现在已经不再作为世界标准时间使用。

UTC,即协调世界时。是经过平均太阳时(以格林威治时间 GMT 为准)、地轴运动修正后的新时标,以「秒」为单位的国际原子时所综合精算而成的时间。为确保UTC与GMT相差不会超过0.9秒,在有需要的情况下(例如 1998-12-31T23:59:60Z)会在UTC内加上正或负闰秒。协调世界时区会使用 “Z” 来表示,协调世界时也会被称为 “Zulu time”。UTC现在作为世界标准时间使用。

所以,UTC与GMT基本上等同,误差不超过0.9秒。不过日常使用中,GMT 与 UTC 的功能与精确度是没有差别的。

时区

时区作为地理概念,表示 “遵守统一时间标准的一个地区”。

使用与 UTC 的偏移来表示时区,例如:中国所在时区为 UTC+08:00(又称为 Chinese Standard Time,即 “中国标准时间”)

地球自西向东旋转,东边比西边先看到太阳,东边的时间也比西边的早。为了统一世界的时间,1884年的国际经度会议规规定将全球划分为24个时区(东、西各12个时区)。规定英国(格林尼治天文台旧址)为零时区(基准 UTC),东1-12区,西1-12区,中国北京处于东8区(UTC+08:00),那么我们的时间会领先基准-也就是我们在早上 9 点时,伦敦是早上 1 点。

Unix时间戳

计算机中的Unix时间戳,使用自 1970-01-01T00:00:00Z(Z 即表示 UTC 时间)至今的毫秒差作为表示时间的数值,并且移除期间的“闰秒”(例如 1998-12-31T23:59:60Z),这么做当然是为了简化计算机对时间操作的复杂度。Unix 时间体系中,每天固定 86400 秒,这个时间是绝对公立的,它和时区没有任何关系。

Java 中的 Unix 时间

Java 确保:每天 24 小时、每小时 60 分、每分钟 60 秒。

Java 中获取 “当前” 时间的方法,其底层实现,全部由 java.lang.System.currentTimeMillis() 提供自 UTC 1970-01-01T00:00:00 的毫秒数。java.lang.System.currentTimeMillis() 作为 native 方法,其实现与 JVM 所在的机器相关(通常使用 NTP 协议保持更新)。

LocalDate、LocalTime、LocalDateTime


java.time.LocalDate 用于表示 “本地日期”,无 “时间”。LocalDate 不承载时区信息。

java.time.LocalTime 用于表示 “本地时间”,无 “日期”。LocalTime 不承载时区信息。

java.time.LocalDateTime 用于表示 “本地日期与时间”。LocalDateTime 不承载时区信息。

LocalDate 实例与 LocalTime 实例能够共同构建 LocalDateTime 实例,由 LocalDateTime 实例能够获取 LocalDate 实例与 LocalTime 实例。

由于 LocalDateTime 不承载时区信息,因此,其不能与 Instant 相互转换,必须提供时区信息。

获取对象的方法

获取对象的方法:

  1. 通过静态方法 :now()(获取的时间是系统当前的时间

  2. 通过静态方法:of()(方法参数可以指定时间

@Test

public void test01() {

/* 通过静态方法 now() 返回该类的实例 */

//获取当前的日期时分秒

LocalDateTime now = LocalDateTime.now();

System.out.println(now);

//获取当前的日期

LocalDate now1 = LocalDate.now();

System.out.println(now1);

//获取当前的时分秒

LocalTime now2 = LocalTime.now();

System.out.println(now2);

System.out.println("=========================================");

/* 静态方法 of() 返回该类的实例 */

//指定日期时分秒

LocalDateTime localDateTime = LocalDateTime.of(2048, 11, 25, 12, 00, 30);

System.out.println(localDateTime);

//指定日期

LocalDate date = LocalDate.of(2020, 12, 12);

System.out.println(date);

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值