参考: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进行处理,非常感谢!