
Gre门客gorianCalendar是一个计算函数,是 Cale会维视对来种统还蛋ndar 的一个具体来自子类,提供了世界上大多数国家/地区使用的标准日历系统。是一种混合日历,可由调用者通过调用 setGreg么电得么挥火orianChange脱斯报注限略模() 来更改起始日期。
- 中文名称 日历
- 外文名称 GregorianCalendar
- 性质 Calendar 的一个具体子类
- 用途 大多数国家使用的标准日历系统
- 调用 setGregorianChange() 更改日期
java.util类 Calendar
java.lang.Object java.util.Calendar
来自所有已实现的接口:
久镇房 Serializable, Cloneable, Com故显贵有看艺parable<Calendar>
直接已知子类:
GregorianCalendar
简介:
public abstract class C纸alendar
ext360百科ends Object
impleme视力式测渐群左nts Serializable, Cloneable, Comparable<Calendar>
Calendar 类是一个抽象类,它为特定瞬间与一组日历字段(诸如YEAR、MONTH、DAY_各答曾航非哪的刚村适OF_MONTH、HOUR等)之间的转换提供了一些德福础误衣沙永仍留司方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970年1月1日的00:00:00.000,格里高利历)的偏移量。
该类还为实现包范围外的具体日历系统提供了其他字段和方法。这些字段和方法被定义为 protecte战排甲略d。
与其他语言环境敏感类一样,Calendar 提供了一起路个类方法 getInstance,以获得此类型的一个通用的对象。
Calendar的getInstance()方法返回一个 Calen算裂月政冲编dar 对象,其日历字段已由当前日期和时间初始化:
Calendar rightNow = Calendar.getInstance();
Calendar 对象的方法会生成所有章日历字段值,为特定语言和日历风格,实现不同的日期-时间格式化。
例如,日语-格里高里历,日语-传统日历。Calendar同时定义了某些日历字段返回值的含义和范围。例如,对于所有日历,日历系统第一个月的值是 MONTH == JANUARY。其他值是由具体子类(例如 ERA)定义的。相关细节请参阅每个字段的文档和子类文档。
获得并设置日历字段值可以通过调用 set 方法来设置日历字段值。在需要计算笔营备叫使歌厂时间值(距历元所经过的毫秒)或形画河得换滑核叫日历字段值之前,不会解释 Calendar 中的所有字段值设置。调用 get、getTimeInMillis、getTime、add 和 roll 涉及此类计算。
宽松性Calendar 有两种解释日历字段的模式,即lenient和non-lenient。当Calendar处于lenie祖拉宁nt模式时,它可接受比它所生他乡斤冷标封你多烟复成的日历字段范围更大范围内的值。当Calendar重新计算日历字段值,以便由get()返回这些值时,所有日历字段都被标准化。
例如,
lenien货第始绿曾整东t模式下的GregorianCalendar将MONTH == JANUARY、DAY_OF_MONTH == 32 解释 February 1。
当 Calendar 处于 non-lenient 模式时,富探孙补置白苗如果其日历字段中存在任何不一致性,它都会抛出一个异常。
例如,
GregorianCalendar 总是首孩磁在1与月份的长度之间生成DAY_OF_MONTH 值。如果已经设置了任何超出范围的字段值,那么在计办终过坏承见式老算时间或日历字段值时,处于non-lenient模式下的GregorianCalendar会抛出一个异常。第一个星期Calendar使用两个参数定义了特定于语言环境的7天制星期:星期的第一天和第一个星期中的最小一天(从1到7)。这些数字取自构造 Calendar 时的语言环境资源数据。还可以通过为其设置值的方法来显式地指定它们。
在设置或获得WEEK_OF_MONTH或WEEK_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 = 1970、MONTH = JANUARY、DAY_OF_MONTH = 1,等等.注:对于某些特别时间的解释可能会有某些歧义,可以用下列方式解决: 23:59 是一天中的最后一分钟,而 00:00 是下一天的第一分钟。因此,1999年12月31日的23:59<2000年1月1日的00:00。尽管从历史上看不够精确,但午夜也属于"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日。规则1将MONTH字段设置为September,因为向August添加13个月得出的就是下一年的September。因为在GregorianCalendar中,DAY_OF_MONTH 不可能是9月31日,所以规则2将DAY_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, 序列化表格
概要
不管你是处理财务交易还是计划着下一步的行动,你都要知道怎样在Java中建立,使用和显示日期。这需要你简单的查阅一下群面降假之便少伯相应类的API参来自考:一个日期可以创建3个相关类的对象。这篇文章告诉你你想要知道的内容。(3,000
本篇文章来源于:开发学院 http://edu. 原文链接:http://edu./2010360百科/0531/23134_3.php
import java.util.*;
import ja结罪热调教剧va.text.*;
public class ParseExample {
public static void main(St传绿头企增ring[] args) {
String ds = "November 1, 2000";
DateFormat df = Date制错种源牛场处景Format.getDateInstance();
try {Date d = df.方讨压parse(ds);}
catch(ParseException e) {System.out.print次药顺待玉子互参血脚ln("Unable to parse " + ds子刘米爱提达干斗);}
在创建一个任意的日期时parse()方法很有用。我将通过另一种方法创建一个任意的岩特显总紧拉资剧室往时日期。同时,你将看到怎样进行基究者本日期计算,例如计算90天后的另一天。你可以使用GregorianCalendar类来完成这个任务。
景婷斗也 GregorianCalendar类
创建庆族一个代表任意日期的一个途径使用GregorianCalendar类钱写益字科统种的构造函数,它包含在java.util包中:
GregorianCalendar(int year, int month, int date)
注意月份的表示,一月是0,二月是1,以此类推,是12月是11。因为大多数人习惯于使用单词而不是使用数字来表示月份,这样程序也许更易读,父类Calendar使用常量来表示月份:JANUARY, FEBRUARY,等等。所以,创建Wilbur 和 Orville制造第一架动力飞机的日期(December 17, 1903),你可以使用:
GregorianCalendar fir挥stFlight = new GregorianCalendar(1903, Calendar.DECEMBER, 17);
出于清楚的考虑,你应该使用前面的形式。但是,你也应粉怎必斯鲁拿气该学习怎样阅读下面的短格式。下面的例子同样表示简责晚味掌鱼土December 17,1903(记住,在短格式中,11表示December)
Gregoria用洲钟蛋宪思剧越nCalendar f边之证irstFlight = new GregorianCalendar(句代低苗1903, 11, 17);
在上一节中,你学习了转换Date对象到字符串。这里,你可以做同样的事情;但是首先,你需要将GregorianCalendar对象转换到Date。要做到这一点,你可以使用getTime()方法,从它得父类Calendar继承而来。GetTime()方法返回GregorianCalendar相应的Date对象。你能够创建GregorianCalendar对象,转换到Date对象,得到和输出相应的字符串这样一个过程。下面是例子:
import java.util.*;
import java.text.*;
public class Flight {
public static void main(String[] args) {
GregorianCalendar firstFlight = new GregorianCalendar(1903, Calendar.DECEMBER, 17);
Date d = firstFlight.getTime();
DateFormat df = DateFormat.getDateInstance();
String s = df.format(d);
System.out.println("First flight was " + s);
}
}
评论留言