20230522 java.util.Calendar
介绍
- java.util.Calendar
public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar>
- 抽象类,提供了特定时刻和一组日历域(field)
- 特定时刻用毫秒值表示,从 Epoch 1970年1月1日0时(GMT,公历)开始的偏移量
- getInstance 方法返回对象
- 支持 Locale, TimeZone
- 支持 lenient 宽松模式
- set 、 add 和 roll 可以更改日历域
API
常量字段
日历域(field)
配合 get
/ set
方法使用:
| 字段 | 值 | 含义|
|---|---|---|---|
| ERA | 0 | 纪元 |
| YEAR | 1 | 年 |
| MONTH | 2 | 月,一年的第一个月是JANUARY ,值为 0 |
| WEEK_OF_YEAR | 3 | 当年的周数,一年中的第一周,值为 1 |
| WEEK_OF_MONTH | 4 | 当月的周数,一个月的第一周,值为 1 |
| DATE | 5 | 月份中的日期。DAY_OF_MONTH
的同义词。月的第一天的值为 1 |
| DAY_OF_MONTH | 5 | DATE
的同义词 |
| DAY_OF_YEAR | 6 | 当前年份中的天数。一年的第一天的值为 1 |
| DAY_OF_WEEK | 7 | 星期几 |
| DAY_OF_WEEK_IN_MONTH | 8 | 当前月份中星期几 |
| AM_PM | 9 | 中午之前还是之后 |
| HOUR | 10 | 上午或下午的小时,用于 12 小时制 (0 - 11)。中午和午夜用 0 表示,而不是 12。 |
| HOUR_OF_DAY | 11 | 一天中的小时数。 HOUR_OF_DAY用于 24 小时制 |
| MINUTE | 12 | 小时内的分钟 |
| SECOND | 13 | 分钟内的秒数 |
| MILLISECOND | 14 | 秒内的毫秒数 |
| ZONE_OFFSET | 15 | 与 GMT 的原始偏移量(以毫秒为单位) |
| DST_OFFSET | 16 | 以毫秒为单位的夏令时偏移量 |
| FIELD_COUNT | 17 | get和set识别的域的数量,不能配合 get
/ set
方法使用 |
MONTH
- JANUARY : 0
- FEBRUARY : 1
- MARCH : 2
- APRIL : 3
- MAY : 4
- JUNE : 5
- JULY : 6
- AUGUST : 7
- SEPTEMBER : 8
- OCTOBER : 9
- NOVEMBER : 10
- DECEMBER : 11
- UNDECIMBER : 12 ,一年中的第十三个月,GregorianCalendar不使用此值,农历会使用
DAY_OF_WEEK
- SUNDAY : 1
- MONDAY : 2
- TUESDAY : 3
- WEDNESDAY : 4
- THURSDAY : 5
- FRIDAY : 6
- SATURDAY : 7
AM_PM
- AM : 0 ,午前
- PM : 1 ,午后
STYLE 样式
配合 getDisplayName
和 getDisplayNames
使用
- ALL_STYLES : 0 ,只能配合
getDisplayNames
使用 - SHORT, SHORT_FORMAT : 1
- LONG, LONG_FORMAT : 2
- NARROW_FORMAT : 4
- NARROW_STANDALONE : 32772
- SHORT_STANDALONE : 32769
- LONG_STANDALONE : 32770
静态方法
- getInstance
- 获取 Calendar 对象,支持
TimeZone
和Locale
- 获取 Calendar 对象,支持
- getAvailableCalendarTypes
- 获取Calendar支持的所有日历类型
- getAvailableLocales
- 获取Calender可用的所有
Locale
对象数组
- 获取Calender可用的所有
公共方法
日历 Calendar
-
getCalendarType
- 返回此Calendar的日历类型
-
isLenient , setLenient
- 宽松模式
-
getDisplayName
-
getDisplayNames
- 返回给定style和locale中日历域的字符串表示形式
-
getTimeInMillis , setTimeInMillis
- 从 1970年1月1日0时距今的 UTC 毫秒值
-
getTimeZone , setTimeZone
- 时区
-
isWeekDateSupported
- 判断当前Calendar对象是否支持周数的表示方式,周数的计算方式,可以根据ISO-8601标准来进行计算
-
getWeeksInWeekYear
- 当年的总周数
-
getWeekYear , setWeekDate
- 返回当前周年
-
getFirstDayOfWeek , setFirstDayOfWeek
- 一周的第一天是什么;例如,美国的SUNDAY ,法国的MONDAY
-
getMinimalDaysInFirstWeek , setMinimalDaysInFirstWeek
- 获取一年中第一周所需的最少天数;例如,如果第一周定义为包含一年第一个月的第一天的一周,则此方法返回 1。如果所需的最少天数必须是整周,则此方法返回 7
-
after , before
-
compareTo
日历域(field)
-
get , set
-
getMaximum, getMinimum
- get 可能返回的最大值、最小值
-
getActualMaximum , getActualMinimum
- 当前Calendar对象的给定日历域的最大值、最小值
-
getGreatestMinimum
- getActualMinimum 可能返回的最大值
-
getLeastMaximum
- getActualMaximum 可能返回的最小值
-
isSet
- 判断指定日历域是否已经设置值
Calendar calendar = Calendar.getInstance(); // 2023-05-22
System.out.println(calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); // 31
System.out.println(calendar.getActualMinimum(Calendar.DAY_OF_MONTH)); // 1
System.out.println(calendar.getGreatestMinimum(Calendar.DAY_OF_MONTH)); // 1
System.out.println(calendar.getLeastMaximum(Calendar.DAY_OF_MONTH)); // 28
修改
- add
- 增加或减少指定的时间
- roll
- 在给定时间字段上添加或减去(向上/向下)单个时间单位而不更改更大的字段。例如,在日期 01/31/96 滚动月份将导致 02/29/96
- clear
- 重置当前 Calendar 对象或日历域
和 java.util.Date
相互转化
- getTime , setTime
和 Instant
相互转化
- toInstant
- 转为
Instant
- 转为
将 Instant
转为 Calendar
Instant instant = Instant.now();
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(instant.toEpochMilli());
Calendar.Builder
支持 Builder 模式
- build
set 系列方法:
日历域相关:
- set(int field, int value)
- setTimeOfDay(int hourOfDay, int minute, int second)
- setWeekDate(int weekYear, int weekOfYear, int dayOfWeek)
- setWeekDefinition(int firstDayOfWeek, int minimalDaysInFirstWeek)
- setDate(int year, int month, int dayOfMonth)
- setFields(int... fieldValuePairs)
- setInstant
- 设置时刻,入参类型是
Date
或long
- 设置时刻,入参类型是
日历相关:
- setCalendarType
- 设置日历类型
- setLenient
- setLocale
- setTimeZone