`
zhanyingle_1981
  • 浏览: 325578 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

2009.11.16

阅读更多

Date date = new Date(calc.getTime());
     Calendar calendar = GregorianCalendar.getInstance();
     calendar.setTime(date);
     int year = calendar.get(Calendar.YEAR)

 

 

 

public abstract class Calendar
extends Object
implements Serializable, Cloneable, Comparable<Calendar>

Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEARMONTHDAY_OF_MONTHHOUR日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。

该类还为实现包范围外的具体日历系统提供了其他字段和方法。这些字段和方法被定义为 protected

与其他语言环境敏感类一样,Calendar 提供了一个类方法 getInstance,以获得此类型的一个通用的对象。CalendargetInstance 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化:

     Calendar rightNow = Calendar.getInstance();
 

Calendar 对象能够生成为特定语言和日历风格实现日期-时间格式化所需的所有日历字段值,例如,日语-格里高里历,日语-传统日历。Calendar 定义了某些日历字段返回值的范围,以及这些值的含义。例如,对于所有日历,日历系统第一个月的值是 MONTH == JANUARY。其他值是由具体子类(例如 ERA)定义的。有关此内容的细节,请参阅每个字段的文档和子类文档。

获得并设置日历字段值

可以通过调用 set 方法来设置日历字段值。在需要计算时间值(距历元所经过的毫秒)或日历字段值之前,不会解释 Calendar 中的所有字段值设置。调用 getgetTimeInMillisgetTimeaddroll 涉及此类计算。

宽松性

Calendar 有两种解释日历字段的模式,即 lenientnon-lenient。当 Calendar 处于 lenient 模式时,它可接受比它所生成的日历字段范围更大范围内的值。当 Calendar 重新计算日历字段值,以便由 get() 返回这些值时,所有日历字段都被标准化。例如,lenient 模式下的 GregorianCalendarMONTH == JANUARYDAY_OF_MONTH == 32 解释为 February 1。

Calendar 处于 non-lenient 模式时,如果其日历字段中存在任何不一致性,它都会抛出一个异常。例如,GregorianCalendar 总是在 1 与月份的长度之间生成 DAY_OF_MONTH 值。如果已经设置了任何超出范围的字段值,那么在计算时间或日历字段值时,处于 non-lenient 模式下的 GregorianCalendar 会抛出一个异常。

第一个星期

Calendar 使用两个参数定义了特定于语言环境的 7 天制星期:星期的第一天和第一个星期中的最小一天(从 1 到 7)。这些数字取自构造 Calendar 时的语言环境资源数据。还可以通过为其设置值的方法来显式地指定它们。

在设置或获得 WEEK_OF_MONTHWEEK_OF_YEAR 字段时,Calendar 必须确定一个月或一年的第一个星期,以此作为参考点。一个月或一年的第一个星期被确定为开始于 getFirstDayOfWeek() 的最早七天,它最少包含那一个月或一年的 getMinimalDaysInFirstWeek() 天数。第一个星期之前的各星期编号为 ...、-1、0;之后的星期编号为 2、3、...。注意,get() 返回的标准化编号方式可能有所不同。例如,特定 Calendar 子类可能将某一年第 1 个星期之前的那个星期指定为前一年的第 n 个星期。

日历字段解析

在计算日历字段中的日期和时间时,可能没有足够的信息用于计算(例如只有年和月,但没有日),或者可能有不一致的信息( 例如 "Tuesday, July 15, 1996"(格林威治时间)——实际上,1996 年 7 月 15 日是星期一 )。Calendar 将解析日历字段值,以便用以下方式确定日期和时间。

如果日历字段值中存在任何冲突,则 Calendar 将为最近设置的日历字段提供优先权。以下是日历字段的默认组合。将使用由最近设置的单个字段所确定的最近组合。

对于日期字段

 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
 

如果在选定的字段组合中,还有尚未设置值的任一日历字段,那么 Calendar 将使用其默认值。每个字段的默认值可能依据具体的日历系统而有所不同。例如,在 GregorianCalendar 中,字段的默认值与历元起始部分的字段值相同:即 YEAR = 1970MONTH = JANUARYDAY_OF_MONTH = 1,等等。

注: 对于某些特别时间的解释可能会有某些歧义,可以用下列方式解决:

  1. 23:59 是一天中的最后一分钟,而 00:00 是下一天的第一分钟。因此,1999 年 12 月 31 日的 23:59 < 2000 年 1 月 1 日的 00:00。
  2. 尽管从历史上看不够精确,但午夜也属于 "am",,中午属于 "pm",所以在同一天,12:00 am ( 午夜 ) < 12:01 am,12:00 pm ( 中午 ) < 12:01 pm。

日期或时间格式字符串不是日历定义的一部分,因为在运行时,用户必须能够修改或重写它们。可以使用 DateFormat 格式化日期。

字段操作

可以使用三种方法更改日历字段:set()add()roll()

 

set(f, value) 将日历字段 f 更改为 value。此外,它设置了一个内部成员变量,以指示日历字段 f 已经被更改。尽管日历字段 f 是立即更改的,但是直到下次调用 get()getTime()getTimeInMillis()add()roll() 时才会重新计算日历的时间值(以毫秒为单位)。因此,多次调用 set() 不会触发多次不必要的计算。使用 set() 更改日历字段的结果是,其他日历字段也可能发生更改,这取决于日历字段、日历字段值和日历系统。此外,在重新计算日历字段之后,get(f) 没必要通过调用 set 方法返回 value 集合。具体细节是通过具体的日历类确定的。

示例:假定 GregorianCalendar 最初被设置为 1999 年 8 月 31 日。调用 set(Calendar.MONTH, Calendar.SEPTEMBER) 将该日期设置为 1999 年 9 月 31 日。如果随后调用 getTime(),那么这是解析 1999 年 10 月 1 日的一个暂时内部表示。但是,在调用 getTime() 之前调用 set(Calendar.DAY_OF_MONTH, 30) 会将该日期设置为 1999 年 9 月 30 日,因为在调用 set() 之后没有发生重新计算。

add(f, delta)delta 添加到 f 字段中。这等同于调用 set(f, get(f) + delta),但要带以下两个调整:

Add 规则 1。调用后 f 字段的值减去调用前 f 字段的值等于 delta,以字段 f 中发生的任何溢出为模。溢出发生在字段值超出其范围时,结果,下一个更大的字段会递增或递减,并将字段值调整回其范围内。

Add 规则 2。如果期望某一个更小的字段是不变的,但让它等于以前的值是不可能的,因为在字段 f 发生更改之后,或者在出现其他约束之后,比如时区偏移量发生更改,它的最大值和最小值也在发生更改,然后它的值被调整为尽量接近于所期望的值。更小的字段表示一个更小的时间单元。HOUR 是一个比 DAY_OF_MONTH 小的字段。对于不期望是不变字段的更小字段,无需进行任何调整。日历系统会确定期望不变的那些字段。

此外,与 set() 不同,add() 强迫日历系统立即重新计算日历的毫秒数和所有字段。

示例:假定 GregorianCalendar 最初被设置为 1999 年 8 月 31 日。调用 add(Calendar.MONTH, 13) 将日历设置为 2000 年 9 月 30 日。Add 规则 1MONTH 字段设置为 September,因为向 August 添加 13 个月得出的就是下一年的 September。因为在 GregorianCalendar 中,DAY_OF_MONTH 不可能是 9 月 31 日,所以 add 规则 2DAY_OF_MONTH 设置为 30,即最可能的值。尽管它是一个更小的字段,但不能根据规则 2 调整 DAY_OF_WEEK,因为在 GregorianCalendar 中的月份发生变化时,该值也需要发生变化。

roll(f, delta)delta 添加到 f 字段中,但不更改更大的字段。这等同于调用 add(f, delta),但要带以下调整:

Roll 规则。在完成调用后,更大的字段无变化。更大的字段表示一个更大的时间单元。DAY_OF_MONTH 是一个比 HOUR 大的字段。

示例:请参阅 GregorianCalendar.roll(int, int)

使用模型。为了帮助理解 add()roll() 的行为,假定有一个用户界面组件,它带有用于月、日、年和底层 GregorianCalendar 的递增或递减按钮。如果从界面上读取的日期为 1999 年 1 月 31 日,并且用户按下月份的递增按钮,那么应该得到什么?如果底层实现使用 set(),那么可以将该日期读为 1999 年 3 月 3 日。更好的结果是 1999 年 2 月 28 日。此外,如果用户再次按下月份的递增按钮,那么该日期应该读为 1999 年 3 月 31 日,而不是 1999 年 3 月 28 日。通过保存原始日期并使用 add()roll(),根据是否会影响更大的字段,用户界面可以像大多数用户所期望的那样运行。

 

 

从以下版本开始:
JDK1.1
另请参见:
System.currentTimeMillis(), Date, GregorianCalendar, TimeZone, DateFormat, 序列化表格
分享到:
评论

相关推荐

    2009.11.16奥巴马上海对话中国青年(中英对照).doc

    奥巴马] 你好。诸位下午好。我感到很荣幸能够有机会到上海跟你们交谈,我要感谢复旦大学的杨校长,感谢他的款待和热情的欢迎。我还想感谢我们出色的大使洪博培,他是我们两国间深厚的纽带。我不知道他刚才说什么,...

    802.11 和802.16协议全集

    802.16.2-2004.pdf 802.16e-2005.pdf 802.16f-2005.pdf 802.16h-2010.pdf 802.16j-2009.pdf 802.16k-2007.pdf 802.16m-2011.pdf 802.16_Conformance01-2003.pdf 802.16_Conformance02-2003.pdf 802.16_...

    tekkamanninja-U-boot-2009.11_tekkaman-16deca6

    "tekkamanninja-U-boot-2009.11_tekkaman-16deca6"这一命名,揭示了我们即将探讨的是一个由用户"tekkamanninja"定制的、基于2009.11版本的U-boot源码分支,其中包含了特定的修改16deca6。本文将深入剖析U-boot的原理...

    IEEE_802.11n_Oct_2009_Final_Version.rar_802 2009_802.11n_eagerx9

    802.11n引入了更高效的调制方式,如64-QAM(64阶正交幅度调制),相比802.11g的16-QAM,能在一个符号中传输更多的数据,从而提升了数据传输速率。 4. 帧聚合(Frame Aggregation): 802.11n协议允许将多个较小的...

    IEEE 802.11标准列表.docx

    16. **IEEE 802.11ac (2012)** - 802.11n的继承者,使用更宽的带宽、更多的MIMO流和高级调制,单信道速率至少达到500Mbps,多站情况下超过1Gbps。 除了这些,还有其他标准如802.11s的Mesh Networking,802.11r的...

    SPI_TEST_BIN.2009.11.25.rar

    在"SPI_TEST_BIN.2009.11.25.rar"这个压缩包中,我们可以推测它可能包含了一系列用于SPI测试的二进制文件。这些二进制文件可能是固件更新、配置文件或者专门的测试程序,用于检查SPI接口的正确性和性能。"BIN"通常是...

    GJB 150.16A-2009 军用装备环境试验方法 第16部振动试验.pdf

    GJB 150.16A-2009 军用装备环境试验方法 第16部振动试验GJB 150.16A-2009 军用装备环境试验方法 第16部振动试验GJB 150.16A-2009 军用装备环境试验方法 第16部振动试验

    PHPWind转Discuz!专用工具-XConvert_for_phpwind.rar

    7.2 转换子体 2009.11.16 修正使用 pw75 - 70_20uch 转换出现的分享问题 2009.11.04 修正 pw 各版本到 Discuz!7.1 的转换子体的辩论主题问题、分享问题、主题分类问题、附件问题 2009.10.31 添加 pw 各版本到...

    r16_project_ov2640_20160120不能编译uboot_验证版本parrotv1.0_20170302_1418没有外层目录.7z

    r16_project_ov2640_20160120不能编译uboot_验证版本parrotv1.0_20170302_1418没有外层目录.7z 开发板:SC3817。全志R16平台点亮OV2640。 切记:一定不要编译uboot。否则,你的LCD没有显示!哈哈哈……

    802.11AC 介绍

    - **802.11n** (2009):实现了更高的吞吐量,最高可达600Mbps,通过MIMO(多输入多输出)技术实现。 - **802.11ac** (2013):这是802.11n的后继者,它在5GHz频段上提供了高达1.3Gbps甚至更高的数据传输速率,极大地提高了...

    Ford EMC-CS-2009.1

    本工程规格书“Ford EMC-CS-2009.1”定义了福特汽车公司(FMC)及其关联车辆品牌所使用的电气/电子(E/E)部件及子系统的电磁兼容性(EMC)要求、测试方法与测试程序。此规格书直接源于ARL-09-0466,并取代了ES-XW7T...

    802.11n.rar

    802.11n标准于2009年发布,旨在克服早期802.11a/b/g标准在数据速率和覆盖范围上的限制,为用户提供更快的网络连接速度,同时保持向后兼容性,以支持已有的802.11设备。 802.11n的核心技术包括: 1. **MIMO(多输入...

    802.11a OFDM MATLAB仿真代码!(推荐).rar

    802.11a+OFDM+MATLAB仿真代码!(推荐).rar (16.72 KB, 下载次数: 582 ) 2009-12-18 09:31 上传 点击文件名下载附件 802.11a+OFDM+MATLAB仿真代码!(推荐). 仿真

    mimo.zip_802.11n_802.11n仿真_out

    2. **802.11n标准**:802.11n是IEEE制定的一个无线局域网标准,它在2009年被正式发布。802.11n引入了MIMO技术,与之前的802.11a/b/g标准相比,提供了更高的传输速率,最大理论速度可以达到600Mbps,实际应用中通常也...

    802.11标准集合

    802.11n(2009年)是一个重要的里程碑,它引入了多输入多输出(MIMO)技术,极大地提高了传输速率,最高可达600Mbps。随后的802.11ac(2013年)在5GHz频段进一步提升,理论最高速度达到1Gbps以上,被称为“千兆Wi-Fi...

    无线局域网标准802.11参照.pdf

    16. **802.11r**:快速基础服务集转换(Fast BSS Transition),减少客户端在不同接入点间的切换延迟。 17. **802.11s (2007)**:定义了无线mesh网络的标准,包括拓扑发现、路由和安全功能。 18. **802.11w (2009)...

    专题资料(2021-2022年)QAY160技术规格欧Ⅲ、OM502LA.Ⅲ2009.11.2版...doc

    - **变速箱**:德国ZF的16AS2602型16前进挡2倒挡电控机械式变速箱,自动和手动操作模式可选。 - **分动箱**:大扭矩输入,应急转向油泵确保动力丧失时仍能转向。 - **车桥**:德国凯斯兰高强度车桥,不同桥的驱动...

    因特达crm2009客户关系管理系统 v2009.11.17

    11、强大的检索功能 强大的搜索及筛选功能,可以单独使用,也可配合使用,并能将搜索结果保存,以便下次调用。 12、强大的数据安全保证 强大的数据安全保证,软件的多级权限管理机制有效地防止用户非法获取其权限...

    802.16e-2005.pdf

    - **频率范围**:IEEE 802.16e-2005 支持在许可频段内操作,通常是在2-11GHz的范围内,这有助于避免与其他无线服务之间的干扰。 - **动态频率选择 (DFS)**:该标准支持动态频率选择功能,允许系统根据环境条件自动...

Global site tag (gtag.js) - Google Analytics