java8 ChronoField日期时间枚举类

前言:

ChronoField是java8提供的一个枚举类,里面定义了很多表示日历的字段,提供基于字段的访问来操纵日期,时间或日期时间, 通过实现TemporalField来扩展标准字段集。

一:ChronoField类概要

包目录:java.time.temporal
类型:枚举类 public enum ChronoField implements TemporalField

一组标准字段。
这组字段提供基于字段的访问来操纵日期,时间或日期时间。 可以通过实现TemporalField来扩展标准字段集。
这些字段旨在适用于多个日历系统。 例如,大多数非ISO日历系统将日期定义为年,月和日,只是略有不同的规则。 每个字段的文档说明了它的运作方式。

实现要求
这是一个最终的,不可变的和线程安全的枚举

二:枚举值及含义

Enum Constant描述
ALIGNED_DAY_OF_WEEK_IN_MONTH一个月内对齐的星期几。
ALIGNED_DAY_OF_WEEK_IN_YEAR一年内对齐的星期几。
ALIGNED_WEEK_OF_MONTH一个月内对齐的一周。
ALIGNED_WEEK_OF_YEAR一年内对齐的一周。
AMPM_OF_DAY当天的AM / PM,从0(AM)到1(PM)
CLOCK_HOUR_OF_AMPM计算AM / PM内的小时数,从1到12.这是在标准的12小时模拟挂钟上观察到的小时数
CLOCK_HOUR_OF_DAY小时,从1到24.这是在24小时模拟挂钟上观察到的小时
DAY_OF_MONTH天。当月第几天
DAY_OF_WEEK星期几,例如星期二。
DAY_OF_YEAR天。当年第几天
EPOCH_DAY该纪元日,基于1970-01-01(ISO)的Java时代。
ERA时代。
HOUR_OF_AMPM计算AM / PM内的小时数,12小时制,从0到11
HOUR_OF_DAY一天中的小时,24小时制,从0到23。这是在标准的24小时数字时钟上观察到的小时
INSTANT_SECONDS即时纪元。
MICRO_OF_DAY计算当天的微秒,从0到(24 * 60 * 60 * 1,000,000) - 1.此字段对于所有日历系统具有相同的含义
MICRO_OF_SECOND计算在秒内的微秒,从0到999,999。 该字段对于所有日历系统具有相同的含义
MILLI_OF_DAY当天的毫秒数,从0到(24 * 60 * 60 * 1,000) - 1
MILLI_OF_SECOND毫秒,从0到999.此字段对于所有日历系统具有相同的含义
MINUTE_OF_DAY一天中的分钟,从0到(24 * 60) - 1
MINUTE_OF_HOUR分钟,从0到59
MONTH_OF_YEAR一年中的月份,例如三月。
NANO_OF_DAY计算当天的纳秒,从0到(24 * 60 * 60 *1,000,000,000) - 1.该字段对于所有日历系统具有相同的含义
NANO_OF_SECOND计算在秒内的纳秒,从0到999,999,999。 该字段对于所有日历系统具有相同的含义。
OFFSET_SECONDS与UTC / Greenwich的偏差。
PROLEPTIC_MONTH基于预感月,从0年开始按月计数。
SECOND_OF_DAY计算当天的秒数,从0到(24 * 60 * 60) - 1
SECOND_OF_MINUTE计算分钟内的秒数,从0到59
YEAR即将到来的一年,如2012年。
YEAR_OF_ERA这个时代的一年。

三:使用示例

LocalDate now = LocalDate.now();
System.out.println("当前日期:"+now);//2021-12-01
//LocalDate with(TemporalField field,long newValue)
System.out.println("下周二:"+now.plusWeeks(1).with(ChronoField.DAY_OF_WEEK, 2)); //2021-12-07
System.out.println("上周二:"+now.minusWeeks(1).with(ChronoField.DAY_OF_WEEK, 2)); //2021-11-23

LocalTime time = LocalTime.now();
System.out.println("当前时间:"+time);//18:07:47.992580600
//int get(TemporalField field)
System.out.println("小时:"+time.get(ChronoField.HOUR_OF_DAY));//18
System.out.println("分钟:"+time.get(ChronoField.MINUTE_OF_HOUR));//7

ALIGNED_DAY_OF_WEEK_IN_MONTH

public static final ChronoField ALIGNED_DAY_OF_WEEK_IN_MONTH
一个月内对齐的星期几。
这表示星期与月初对齐的一周内的天数的概念。 该字段通常与ALIGNED_WEEK_OF_MONTH一起使用 。

例如,在具有七天工作周的日历系统中,第一个对齐的周工作日开始于第1个月,第二个对齐工作周从第8个月开始,依此类推。 在每个对齐周内,日期从1到7编号,并作为此字段的值返回。 因此,每月的1到7天将具有从1到7的星期值对齐。并且每月8到14天将重复此操作,其中每周的对齐值从1到1 7。

没有七天工作周的日历系统通常应以相同的方式实现此字段,但使用备用周长度。

ALIGNED_DAY_OF_WEEK_IN_YEAR

public static final ChronoField ALIGNED_DAY_OF_WEEK_IN_YEAR
一年内对齐的星期几。
这表示在一周内将周数与年初对齐的天数的概念。 该字段通常与ALIGNED_WEEK_OF_YEAR一起使用 。

例如,在具有七天工作周的日历系统中,第一个对齐周开始于第一年的第一天,第二个对齐周开始于第八年的日期,依此类推。 在每个对齐周内,日期从1到7编号,并作为此字段的值返回。 因此,第1年到第7年的每周日期值将从1到7保持一致。而日期8到14将重复此操作,并且每周的对齐值从1到1 7。

没有七天工作周的日历系统通常应以相同的方式实现此字段,但使用备用周长度。

EPOCH_DAY

public static final ChronoField EPOCH_DAY
该纪元日,基于1970-01-01(ISO)的Java时代。
此字段是1970-01-01(ISO)为零的连续天数。 请注意,这使用本地时间线,忽略偏移和时区。

该字段严格定义为在所有日历系统中具有相同含义。 这对于确保日历之间的互操作是必要的。

EpochDay的范围介于(LocalDate.MIN.toEpochDay(),LocalDate.MAX.toEpochDay())之间。

ALIGNED_WEEK_OF_MONTH

public static final ChronoField ALIGNED_WEEK_OF_MONTH
一个月内对齐的一周。
这表示在一个月内将周数与月初对齐的周数的概念。 该字段通常与ALIGNED_DAY_OF_WEEK_IN_MONTH一起使用 。

例如,在具有七天工作周的日历系统中,第一个对齐的周工作日开始于第1个月,第二个对齐工作周从第8个月开始,依此类推。 因此,日期值1到7在对齐的第1周中,而日期值8到14在对齐的第2周中,依此类推。

没有七天工作周的日历系统通常应以相同的方式实现此字段,但使用备用周长度。

ALIGNED_WEEK_OF_YEAR

public static final ChronoField ALIGNED_WEEK_OF_YEAR
一年内对齐的一周。
这表示一周内的周数的概念,其中周数与年初对齐。 该字段通常与ALIGNED_DAY_OF_WEEK_IN_YEAR一起使用 。

例如,在具有七天工作周的日历系统中,第一个对齐周开始于第一年的第一天,第二个对齐周开始于第八年的日期,依此类推。 因此,日期值1到7在对齐的周1中,而日期值8到14在对齐的周2中,依此类推。

没有七天工作周的日历系统通常应以相同的方式实现此字段,但使用备用周长度。

PROLEPTIC_MONTH

public static final ChronoField PROLEPTIC_MONTH
基于预感月,从0年开始按月计数。
该字段是月份的连续计数,其中在预感年零的第一个月具有零值。 后来几个月的价值越来越大。 早些月的价值越来越小。 几个月的顺序没有间隙或中断。 请注意,这使用本地时间线,忽略偏移和时区。

在默认的ISO日历系统中,2012年6月的值为(2012 * 12 + 6 - 1) 。 该字段主要供内部使用。

非ISO日历系统必须按照上面的定义实现此字段。 它只是从预感0年开始经过几个月的简单零基数。所有具有完整的预感年定义的日历系统将具有零年。 如果日历系统的最小年份不包括零年份,则必须外推一个,以便定义此方法。

YEAR_OF_ERA

public static final ChronoField YEAR_OF_ERA
这个时代的一年。
这代表了时代内的年度概念。 该字段通常与ERA一起使用 。

日期的标准心理模型基于三个概念 - 年,月和日。 这些映射到YEAR , MONTH_OF_YEAR和DAY_OF_MONTH领域。 请注意,没有提及时代。 日期的完整模型需要四个概念 - 时代,年,月和日。 这些映射到ERA , YEAR_OF_ERA , MONTH_OF_YEAR和DAY_OF_MONTH领域。 是否使用此字段或YEAR取决于使用的心智模型。 有关此主题的更多讨论,请参见ChronoLocalDate 。

在默认的ISO日历系统中,有两个定义的时间,'BCE''CE'。 时代'CE'是目前正在使用的时代,时代的年代从1到最大值。 'BCE'时代是前一个时代,时代倒退。

例如,每次减去一年产生以下结果:
- 年度保证2 ='CE'年代2
- 年度保证1 ='CE'年代1
- 年度保证0 ='BCE'年代1
- 年 - 保证-1 ='BCE'年代2

请注意,ISO-8601标准实际上并未定义时代。 另请注意,由于Julian和Gregorian日历系统之间的变化,ISO时代与众所周知的AD / BC时代不一致。

非ISO日历系统应使用日历系统用户最公认的年份值来实现此字段。 由于大多数日历系统只有两个时代,因此年代编号方法通常与ISO日历系统使用的相同。 时代的价值通常应该是正值,但这不是必需的。

YEAR

public static final ChronoField YEAR
即将到来的一年,如2012年。
这代表了年份的概念,按顺序计数并使用负数。 这个时代的解释并不是对这个时代的解释。 请参阅YEAR_OF_ERA ,以获取显示从无效年份到年份的映射的示例。

日期的标准心理模型基于三个概念 - 年,月和日。 这些映射到YEAR , MONTH_OF_YEAR和DAY_OF_MONTH领域。 请注意,没有提及时代。 日期的完整模型需要四个概念 - 时代,年,月和日。 这些映射到ERA , YEAR_OF_ERA , MONTH_OF_YEAR和DAY_OF_MONTH领域。 是否使用此字段或YEAR_OF_ERA取决于正在使用的心智模型。 有关此主题的更多讨论,请参见ChronoLocalDate 。

非ISO日历系统应按如下方式实现此字段。 如果日历系统在固定日期之前和之后只有两个时代,那么预感年值必须与后一时代的年代价值相同,并且对于早期时代越来越不利。 如果日历系统具有两个以上的时间,那么可以用任何适当的值来定义预感年值,尽管将其定义为与ISO相同可能是最佳选择。

ERA

public static final ChronoField ERA
时代。
这代表了时代的概念,这是时间线的最大分支。 该字段通常与YEAR_OF_ERA一起使用 。

在默认的ISO日历系统中,有两个定义的时间,'BCE''CE'。 时代'CE'是目前正在使用的时代,时代的年代从1到最大值。 'BCE'时代是前一个时代,时代倒退。 有关完整示例,请参见YEAR_OF_ERA 。

非ISO日历系统应实现此字段以定义时代。 必须为1970-01-01(ISO)上激活的时代的值赋值1.早期的时间必须具有连续的较小值。 后来的时代必须有更大的值,

INSTANT_SECONDS

public static final ChronoField INSTANT_SECONDS
即时纪元。
这表示1970-01-01T00:00Z(ISO)为零的连续秒数的概念。 该字段可以与NANO_OF_SECOND一起使用以表示第二个的分数。

Instant表示时间线上的瞬时点。 就其本身而言,瞬间没有足够的信息来允许获得本地日期时间。 只有与偏移或时区配对才能计算本地日期或时间。

该字段严格定义为在所有日历系统中具有相同含义。 这对于确保日历之间的互操作是必要的。

OFFSET_SECONDS

public static final ChronoField OFFSET_SECONDS
与UTC / Greenwich的偏差。
这代表了UTC / Greenwich当地时间偏移量的概念。

ZoneOffset表示当地时间与UTC /格林威治不同的时间段。 这通常是固定的小时数和分钟数。 它相当于以秒为单位的偏移量的total amount 。 例如,在冬季,巴黎的偏移量为+01:00 ,即3600秒。

该字段严格定义为在所有日历系统中具有相同含义。 这对于确保日历之间的互操作是必要的。

参考链接:
https://nowjava.com/docs/java-api-11/java.base/java/time/temporal/ChronoField.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值