所述类是一个抽象类,可以为在某一特定时刻和一组之间的转换的方法如 , , , ,等等,以及用于操纵该日历字段,如获取的日期下个星期。 瞬间可以用毫秒值表示,该值是1970年1月1日格林威治标准时间1970年1月1日00:00:00,000(格里高利)的Epoch的偏移量。该类还提供了用于在包外实现具体日历系统的附加字段和方法。 这些字段和方法定义为 。
与其他区域设置敏感的类一样, 提供了一个类方法 ,用于获取此类型的通用对象。 的方法返回一个对象,其日历字段已使用当前日期和时间初始化:
Calendar rightNow = Calendar.getInstance();
对象可以生成实现特定语言和日历样式的日期时间格式所需的所有日历字段值(例如,日语 - 格里高利语,日语 - 繁体语)。 定义某些日历字段返回的值范围及其含义。 例如,日历系统的第一个月的所有日历的值为 。 其他值由具体子类定义,例如 。 有关详细信息,请参阅各个字段文档和子类文档。
可以通过调用方法来设置日历字段值。 设置的任何字段值在需要计算其时间值(距Epoch的毫秒数)或日历字段的值之前不会被解释。 调用 , , , 和涉及这样的计算。
宽大
具有解释日历字段, 宽松 , 非宽松的两种模式。 当处于宽松模式时,它接受比它产生的更广泛的日历字段值。 当重新计算返回日历字段值时, 所有日历字段进行规范化。 例如,宽松解释 , 如2月1日。
当处于非宽松模式时,如果其日历字段中存在任何不一致,则会抛出异常。 例如, 始终生成介于1和月长之间的值。 如果已设置任何超出范围的字段值,则非宽松在计算其时间或日历字段值时抛出异常。
First Week
使用两个参数定义特定于语言环境的七天工作周:一周的第一天和第一周的最小天数(从1到7)。 当构造时,这些数字取自语言环境资源数据或语言环境本身。 如果指定的区域设置包含“fw”和/或“rg” Unicode extensions ,则将根据这些扩展名获取一周的第一天。 如果同时指定了“fw”和“rg”,则“fw”扩展名中的值将取代“rg”扩展名中的隐含值。 它们也可以通过设置其值的方法明确指定。设置或获取或字段时, 必须将月份或年份的第一周确定为参考点。 一个月或一年的第一周被定义为从开始并且包含该月或年的至少天的最早的七天期。 周数在第一周之前编号为......,-1,0; 周数为2,3,......跟随它。 请注意, 返回的规范化编号可能不同。 例如,特定的子类可以将一年的第1周之前的一周指定为前一年的第周。
日历字段分辨率
从日历字段计算日期和时间时,可能没有足够的信息用于计算(例如只有年月和月份没有日期),或者可能存在不一致的信息(例如1996年7月15日星期二(格里高利) ) - 1996年7月15日实际上是星期一)。 将解析日历字段值以按以下方式确定日期和时间。If there is any conflict in calendar field values, gives priorities to calendar fields that have been set more recently.以下是日历字段的默认组合。 将使用由最近设置的单个字段确定的最新组合。
For the date fields :
For the time of day fields :YEAR + MONTH + DAY_OF_MONTH YEAR + MONTH + WEEK_OF_MONTH + DAY_OF_WEEK YEAR + MONTH + DAY_OF_WEEK_IN_MONTH + DAY_OF_WEEK YEAR + DAY_OF_YEAR YEAR + DAY_OF_WEEK + WEEK_OF_YEAR
HOUR_OF_DAY AM_PM + HOUR
如果有任何日历字段的值未在所选字段组合中设置,则将使用其默认值。 每个字段的默认值可能因具体的日历系统而异。 例如,在 ,一个字段的默认值是相同的时代的开始:即 , , ,等等。
注意:某些奇异时间的解释存在某些可能的含糊之处,可通过以下方式解决:
- 23:59是一天中的最后一分钟,00:00是第二天的第一分钟。 因此,1999年12月31日23:59 <2000年1月1日00:00 <00:01,2000年1月1日。
- 虽然历史上不准确,午夜也属于“上午”,中午属于“下午”,所以在同一天,凌晨12:00(午夜)<12:01 am,中午12:00(中午)<12 :01 pm
日期或时间格式字符串不是日历定义的一部分,因为用户必须在运行时可修改或覆盖这些字符串。 使用格式化日期。
野外操纵
:日历字段可以用三种方法来改变 , 和 。改变日历字段至 。 此外,它设置内部成员变量以指示日历字段已更改。 尽管日历字段立即更改,以毫秒为单位日历的时间值不重新计算,直到下一次调用 , , , ,或而成。 因此,对多次调用不会触发多次不必要的计算。 作为使用更改日历字段的结果,其他日历字段也可能会更改,具体取决于日历字段,日历字段值和日历系统。 此外, 不一定返回通过电话设置到方法日历字段已重新计算后。 具体情况由具体的日历类决定。
例如 :考虑最初被设置为1999调用8月31日, 集日至9月31日,1999年这是一个临时的内部表示解析为1999年10月1日,如果 ,然后调用。 但是,在调用之前调用将日期设置为1999年9月30日,因为在之后没有重新计算。
增加到现场 。 这相当于通过两次调整调用 :
Add rule 1. The value of field after the call minus the value of field before the call is , modulo any overflow that has occurred in field . Overflow occurs when a field value exceeds its range and, as a result, the next larger field is incremented or decremented and the field value is adjusted back into its range.
Add rule 2. If a smaller field is expected to be invariant, but it is impossible for it to be equal to its prior value because of changes in its minimum or maximum after field is changed or other constraints, such as time zone offset changes, then its value is adjusted to be as close as possible to its expected value. A smaller field represents a smaller unit of time. is a smaller field than . No adjustment is made to smaller fields that are not expected to be invariant. The calendar system determines what fields are expected to be invariant.
此外,与不同, 强制立即重新计算日历的毫秒数和所有字段。
例如 :考虑最初被设置为1999调用8月31日, 集日历9月30日,2000年添加规则1套场至九月,因为加入13个月月给明年九月。 由于不能在9月份的 ,因此添加规则2将设置为最接近的可能值。 虽然它是一个较小的字段, 规则2没有对进行调整,因为当月份在发生变化时,预计会发生变化。
增加到现场不更改更大的字段。 这相当于通过以下调整调用 :
Roll rule. Larger fields are unchanged after the call. A larger field represents a larger unit of time. is a larger field than .
示例 :请参阅 。
使用模式 。 要激发和的行为,请考虑具有月,日和年的递增和递减按钮以及基础的用户界面组件。 如果界面读取1999年1月31日并且用户按下月份增量按钮,它应该读取什么? 如果底层实现使用 ,它可能会读到1999年3月3日。更好的结果将是1999年2月28日。此外,如果用户再次按月增量按钮,它应该是1999年3月31日,而不是1999年3月28日。通过保存原始日期并使用或 ,取决于是否应该影响更大的字段,用户界面可以像大多数用户直观期望的那样运行。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/java-jiao-cheng/5475.html