JDK8 after时间日期api

参考:https://zq99299.github.io/java-tutorial/datetime/iso/
?

介绍

?

简介

?

before JDK8 时间日期Api缺点:

1?? 可变性:对于时间与日期而言应该是不可变的

2?? 安全性:线程不安全,且不能处理闰秒
?
? ?? ?百度百科:

? 闰秒,是指为保持协调世界时接近于世界时时刻,由国际计量局统一规定在年底或年中(也可能在季末)对协调世界时增加或减少1 秒的调整。由于地球自转的不均匀性和长期变慢性(主要由潮汐摩擦引起的),会使 世界时(民用时)和原子时之间相差超过到 ±0.9秒时,就把协调世界时向前拨1秒(负闰秒,最后一分钟为59秒)或向后拨1秒(正闰秒,最后一分钟为61秒); 闰秒一般加在 公历年末或公历六月末。

? 目前,全球已经进行了27次闰秒,均为正闰秒。

? 最近一次闰秒在北京时间2017年1月1日7时59分59秒(时钟显示****07:59:60)出现。这也是本世纪的第五次闰秒。

3?? 偏移性:月份是从0开始的 — Date 月份从0开始,一月是0,十二月是11

4?? 格式化:格式化只能处理Data,而不能直接处理Calender

?

after JDK8时间日期API

?? 不可变性、域驱动(Data与Time严格分离,而不像之前的Data即包含时间又包含日期)、线程安全(每次的修改动作返回的是一个新的对象)

?
分类:

? java.time -> 包含值对象的基础包。

? java.time.chrono -> 提供对不同的日历系统的访问。

? java.time.format -> 提供格式化和解析时间和日期。

? java.time.temporal -> 包括底层框架和扩展特性。

? java.time.zone -> 包含时区支持的类。

说明:对于大多数开发者只会用到基础包和format包,也可能用到temporal包。因此尽管有68个新的公开类型,大多数开发者,大概只会用到其中的三分之一。

?
?

Zoned – 时区

UTC、GMT、CST、DST、时区、夏令时偏移量:彻底弄懂GMT、UTC、时区和夏令时 – 知乎 (zhihu.com)

全球城市ZoneId和UTC时间偏移量的最全对照表 – YourBatman – 博客园 (cnblogs.com)

JSR310新日期API(一)-时区与时间偏移量 – 云+ 区 – 腾讯云 (tencent.com)

?

ZonedId

介绍:

  • 表示时区 ID,例如Europe/Paris,它是旧API TimeZone 的替代。
    ZoneId用于标识用于在Instant和LocalDateTime之间转换的规则。

  • 有两种不同类型的 ID,对应着两个实现类:

    • 固定偏移量(ZoneOffset) – UTC/格林威治的完全解析偏移量,对所有本地日期时间使用相同的偏移量

      • UTC或者GMT。

      • Z(相当于UTC)。

      • +h或者-h。

      • +hh或者-hh。

      • +hh:mm或者-hh:mm。

      • +hh:mm:ss或者-hh:mm:ss。

      • +hhmmss或者-hhmmss。

    • 地理区域 (ZoneRegion,default权限包内访问)- 应用一组特定规则来查找 UTC/格林威治偏移量的区域

      • Asia/Shanghia
      • 。。。
  • 大多数固定偏移量由ZoneOffset表示。对任何ZoneId调用normalized()将确保固定偏移 ID 将表示为ZoneOffset (UTC)。

  • 描述偏移量何时以及如何变化的实际规则由ZoneRules定义。

  • 这个类只是一个用来获取底层规则的ID。 之所以采用这种方法,是因为规则是由政府定义的并且经常变化,而 ID 是稳定的。

?
of、from方法

获取ZonedId实例

?
other

getAvailableZoneIds():获取当前可用的zoneId

systemDefault():根据系统获取zoneId

ofOffset(String prefix, ZoneOffset offset):获取一个包含偏移量的ZoneId实例。如果前缀是“GMT”、“UTC”或“UT”,则ZoneId带有前缀和非零偏移量的ZoneId 。 如果前缀为空 ,则返回ZoneOffset 。

normalized():固定偏移 ID 将表示为ZoneOffset

?

ZoneRules — 时区规则

简介:

ZoneRulesProvider用于加载Zone Rule(时区规则,),自定义实现是可以通过系统变量设置为自定义的提供类,或者通过SPI加载,默认的实现类是,会加载文件

?

ZoneOffset — 固定偏移量

简介:

  • ZonedId的实现类,表示格林威治/UTC 的时区偏移量,例如+02:00 。

  • 时区偏移量是时区与格林威治/UTC 不同的时间量。 这通常是固定的小时数和分钟数。

  • 世界不同地区有不同的时区偏移。 ZoneId类中捕获了偏移量如何因地点和一年中的时间而变化的规则。
    例如:

    巴黎在冬天比格林威治/UTC 早一小时,在夏天比格林威治/UTC 早两小时。 巴黎的ZoneId实例将引用两个ZoneOffset实例 – 冬季的+01:00实例和夏季的+02:00实例。

    2008 年,世界各地的时区偏移从 -12:00 扩展到 +14:00。 为防止扩展该范围时出现任何问题,但仍提供验证,偏移范围限制为 -18:00 到 18:00(含)。

?

示例:

表示东xx区,表示西xx区 注意:是在格林威治/UTC 下

?
?

Clock – 时钟

大多基于 temporal 对象都提供了一个无参数的 方法,它提供了使用系统时钟和默认时区的当前日期和时间。 这些基于时间的对象还提供了一个单参数 now (clock) 方法, 允许您传入另一个时钟。

当前日期和时间取决于时区,对于全球化应用程序, 是确保日期/时间使用正确时区创建所必需的。 因此,虽然 Clock 类的使用是可选的,但此功能允许您测试您的代码是否适用于其他时区,或者使用时间不变的固定时钟。

Clock 是一个抽象类,所以不能创建它的一个实例,以下工厂方法可用于测试。

  • Clock.offset(Clock,Duration)返回一个被指定持续时间偏移的时钟。
  • Clock.systemUTC()返回表示格林尼治/ UTC 时区的时钟。
  • Clock.fixed(Instant,ZoneId)总是返回相同的 Instant。对于这个时钟,时间停滞不前。

?
?

Temporal – 时间

java.time.temporal 提供了一组接口、类和枚举,它们支持日期和时间代码,特别是日期和时间计算

?
接口:

Interface Description
Temporal 框架级接口,定义对临时对象(如日期、时间、偏移量或这些对象的某种组合)的读写访问。
TemporalAccessor 框架级接口,定义对临时对象(如日期、时间、偏移量或这些对象的某种组合)的只读访问
TemporalAdjuster 调整时间对象的策略
TemporalAmount 框架级接口定义时间,如”6 小时”、“8 天”或”2 年零 3 个月”。
TemporalField 日期时间的字段,比如:month-of-year或hour-of-minute。
TemporalQuery 查询时间对象的策略。
TemporalUnit 日期时间的单位,如Days 或 Hours。

?
类:

Class Description
IsoFields 特定于ISO-8601日历系统的字段和单位,包括季度和以周为单位的年
JulianFields 一组日期字段,提供对Julian Days的访问。
TemporalAdjusters 工具类,提供TemporalAdjuster对象.
TemporalQueries 工具类,提供TemporalQuery 的通用实现
ValueRange 日期-时间字段的有效值范围。
WeekFields day-of-week、week-of-month、 week-of-year 字段的本地化定义。

?
枚举:

Enum Description
ChronoField 一组标准的字段
ChronoUnit 一组标准的日期周期单位

?
关系:

TemporalAccessor 接口提供的只读版本 Temporal 接口。

Temporal and TemporalAccessor 对象是用字段来定义的,如TemporalField 接口, ChronoField 是一个具体的实现 TemporalField 接口的枚举类;并提供了一套丰富的定义的常量,如 DAY_OF_WEEK,MINUTE_OF_HOUR,和MONTH_OF_YEAR。

这些字段的单位由 TemporalUnit接口指定 。 ChronoUnit 枚举实现 TemporalUnit 接口。ChronoField.DAY_OF_WEEK 字段是 ChronoUnit.DAYS和ChronoUnit.WEEKS 的组合;

Temporal 接口中的基于算术的方法需要使用 TemporalAmount值定义的参数 。Period and Duration 类实现了 TemporalAmount 接口

?

TemporalField – 时间属性

接口,表示日期时间字段,例如月份或分钟。

日期和时间使用字段来表示,这些字段将时间线划分为对人类有意义的内容。 此接口的实现表示这些字段。

最常用的单位在ChronoField中定义。 在IsoFields 、 WeekFields和JulianFields中提供了更多字段。 应用程序代码也可以通过实现这个接口来编写字段。

?

ChronoField

ChronoFiled为该接口的实现类,提供了一组用于访问日期和时间值的常量,比如:CLOCK_HOUR_OF_DAY,NANO_OF_DAY 和 DAY_OF_YEAR,

But 有些时间、日期类不支持某些属性,比如LocalDate不支持ChronoField.CLOCK_HOUR_OF_DAY,此时可以使用TemporalAccessor.isSupported(TemporalField)来查看是否支持:

?

IsoField

特定于 ISO- 8601 日历系统,定义了一些特定的字段

?

Date Day-of-week Field values
2008-12-28 Sunday(星期天) Week 52 of week-based-year 2008
2008-12-29 Monday(星期一) Week 1 of week-based-year 2009
2008-12-31 Wednesday( 星期三) Week 1 of week-based-year 2009
2009-01-01 Thursday(星期四) Week 1 of week-based-year 2009
2009-01-04 Sunday(星期日) Week 1 of week-based-year 2009
2009-01-05 Monday( 星期一) Week 2 of week-based-year 2009

?

Other

  • WeekFields : 提供了在某些周相关的访问

    • 2008-12-31 星期三
    • 2008 年 12 月第 5 周
    • 2008 年 12 月第 5 周
    • 2009 年第 1 周
    • 2008 年第 53 周
    • 。。。。
  • JulianFields

    天文科学界的时间表达

?

TemporalUnit – 时间单位

接口,表示日期时间单位,例如Days、Hours。
时间的测量建立在单位上,例如years、months、days、hours、minutes and seconds。 此接口的实现代表这些单元。

此接口的实例表示单位本身,而不是单位的数量。 请参阅Period以了解用通用单位表示金额的类。
最常用的单位在ChronoUnit中定义。 在IsoFields中提供了更多单位。 单元也可以通过实现这个接口由应用程序代码编写。
该单元使用双重调度工作。 客户端代码调用像LocalDateTime这样的日期时间的方法来检查单位是否是ChronoUnit 。 如果是,则日期时间必须处理它。 否则,将方法调用重新调度到此接口中的匹配方法。

?

ChronoUnit

ChronoUnit类时TemporalUnit接口实现类,提供了一组根据日期和时间,从毫秒到几千年标准单元,比如:MONTHS、YEARS等。

BUT 类似于ChronoFiled,有些时间日期类可能也不支持某些单位,比如Instant 不支持DAYS,TemporalAccessor.isSupported(TemporalUnit)方法可用于验证一个类是否支持特定时间单位。

?

IsoField

IsoFields内部也定义了关于TemporalUnit 的常量

?

TemporalAdjuster – 时间调整器

接口,是修改时间对象的关键工具,可以用于任何基于时间/ Temporal 的类型。

它们的存在是为了将调整过程外部化,允许根据策略设计模式使用不同的方法。

TemporalAdjusters类包含一组标准的调整器,可用作静态方法。 这些包括:
查找该月的第一天或最后一天
找到下个月的第一天
找到一年的第一天或最后一天
寻找明年的第一天
查找一个月内的第一天或最后一天,例如“六月的第一个星期三”
查找下一周或上一天,例如“下周四”

实现类:

LocalDate、LocalTime、LocalDateTime、Instant、Year、YearMonth、Month、MonthDay、DayOfMoth等类或枚举

public enum Month implements 

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年9月6日
下一篇 2021年9月6日

相关推荐