java8 ChronoField日期时间枚举类
ChronoField是Java 8日期时间API中的一个枚举类,它包含了所有的日期时间字段,如年、月、日、星期、时、分、秒等。这个枚举类提供了统一的字段访问方式,使我们可以轻松获取日期时间对象中的某个字段信息。
例如,我们可以像下面这样使用ChronoField
来获取LocalDate
中的年、月、日信息:
LocalDate date = LocalDate.now();
int year = date.get(ChronoField.YEAR);
int month = date.get(ChronoField.MONTH_OF_YEAR);
int day = date.get(ChronoField.DAY_OF_MONTH);
下表列出了ChronoField
中的部分枚举值及其含义:
枚举值 | 含义 |
---|---|
YEAR | 年份 |
MONTH_OF_YEAR | 年中的月份 |
DAY_OF_WEEK | 一周中的第几日 |
DAY_OF_MONTH | 月份中的第几日 |
DAY_OF_YEAR | 年份中的第几日 |
WEEK_OF_WEEK_BASED_YEAR | 基于周的年份的第几周 |
HOUR_OF_DAY | 一天中的第几小时 |
CLOCK_HOUR_OF_DAY | 一天的第几点钟时间 |
MINUTE_OF_HOUR | 一小时的第几分钟 |
SECOND_OF_MINUTE | 一分钟的第几秒 |
NANO_OF_SECOND | 一秒中的纳秒部分 |
INSTANT_SECONDS | 自1970-01-01T00:00:00Z的秒数 |
OFFSET_SECONDS | 时区偏移seconds |
枚举值范围
每个枚举值都有其允许的范围,我们可以使用getRange()
方法获取:
value.getRange();
例如:
YEAR.getRange(); //YearRange[MIN_VALUE=-999999999, MAX_VALUE=999999999]
MONTH_OF_YEAR.getRange(); //ValueRange[MIN=1, MAX=12]
DAY_OF_WEEK.getRange(); //ValueRange[MIN=1, MAX=7]
超出范围会抛出DateTimeException
异常。
枚举值间的关系
某些枚举值之间有着严格的关系,例如:
- 一年中的第几日(DAY_OF_YEAR) = 一月中的第几日(DAY_OF_MONTH) + 之前月份总天数之和
- 一周中的第几日(DAY_OF_WEEK) = 一天中的小时数(HOUR_OF_DAY) / 24 + 1 我们可以利用这些关系来计算某个字段的值。
字段解析/格式化
在格式化和解析日期时间的过程中,ChronoField也起到很重要的作用。DateTimeFormatter
要格式化哪些字段,需要传入相应的ChronoField
枚举值。
例如:
//格式化年月日
DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd");
f.format(date);
//相当于
DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-", ChronoField.YEAR, "-MM-", ChronoField.MONTH_OF_YEAR,"-dd", ChronoField.DAY_OF_MONTH);
f.format(date);
在解析的过程中,需要传入ChronoField
枚举值来指定要解析的字段。
ChronoField枚举类在日期时间API中处于核心位置,理解这个类的用法和作用可以更好的掌握日期时间API。