admin 管理员组

文章数量: 887055


2024年1月14日发(作者:java面试选择题)

JA V A处理日期时间常用方法:ar

Calendar 类是一个抽象类,它为特定瞬间与一组诸如YEAR、MONTH、

DAY_OF_MONTH、HOUR 等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间1970 年 1 月1 日的00:00:00。000,格里高利历的偏移量.

例:Calendar cal = Calendar。getInstance(;//使用默认时区和语言环境获得一个日历。

cal。add(_OF_MONTH, -1;//取当前日期的前一天。

cal。add(Calendar。DAY_OF_MONTH, +1;//取当前日期的后一天。

//通过格式化输出日期

DateFormat format = new 。SimpleDateFormat(”yyyy-MM—dd";

System。n("Today is:”+format。format(tance(.getTime(;

System。n("yesterday is:"+(e(;

得到2007—12-25日期: Calendar calendar = new GregorianCalendar(2007,

11, 25,0,0,0;

Date date = e(;System。n("2007 Christmas

is:”+(date;

//java月份是从0—11,月份设置时要减1。

//GregorianCalendar构造方法参数依次为:年,月—1,日,时,分,秒。

取日期的部分: int year =calendar。get(Calendar。YEAR;

int month=(+1;

int day =calendar。get(Calendar。DAY_OF_MONTH;

int hour =(Calendar。HOUR_OF_DAY;

int minute =(;

int seconds =(;

取月份要加1.判断当前月份的最大天数:

Calendar cal = Calendar。getInstance(;

int day=ualMaximum(Calendar。DAY_OF_MONTH;

System。out。println(day; java。util。Date

类Date 表示特定的瞬间,精确到毫秒.从JDK 1。1 开始,应该使用Calendar 类实现日期和时间字段之间转换,使用DateFormat 类来格式化和分析日期字符串。Date 中的相应方法已废弃。尽管Date 类打算反映协调世界时(UTC,但无法做到如此准确,这取决于Java 虚拟机的主机环境。当前几乎所有操作系统都假定 1 天=

24 × 60 × 60 = 86400 秒.但对于UTC,大约每一两年出现一次额外的一秒,称为“闰秒”.闰秒始终作为当天的最后一秒增加,并且始终在12 月31 日或 6 月30 日增加。例如,1995 年的最后一分钟是61 秒,因为增加了闰秒.大多数计算机时钟不是特别的准确,因此不能反映闰秒的差别。

在类Date 所有可以接受或返回年、月、日期、小时、分钟和秒值的方法中,将使用下面的表示形式:年份y由整数y — 1900 表示。

∙月份由从0 至11 的整数表示;0 是一月、1 是二月等等;因此11 是十二月。

∙日期(一月中的某天按通常方式由整数1 至31 表示。

∙小时由从0 至23 的整数表示。因此,从午夜到1 a.m。 的时间是0 点,从中午到

的时间是1

2 点。

∙分钟按通常方式由0 至59 的整数表示.

∙秒由0 至61 的整数表示;值60 和61 只对闰秒发生,尽管那样,也只用在实际正确跟踪闰秒的Java 实现中。于按当前引入闰秒的方式,两个闰秒在同一分钟内发生是极不可能的,但此规范遵循ISO C 的日期和时间约定。

在所有情形中,针对这些目的赋予方法的参数不需要在指定的范围内;例如,可以把日期指定为1 月32 日,并把它解释为2 月 1 日的相同含义。

today=new 。Date(;

System。out。println("Today is "+(today;

取当月的第一天:

java。DateFormat format = new java。DateFormat(”yyyy-MM—01";

java。util。Date firstDay=new java。(;

。println(”the month first day is "+(firstDay;

取当月的最后一天:

Calendar cal = Calendar。getInstance(;

int maxDay=cals。getActualMaximum(_OF_MONTH;

formatter3=new java。DateFormat(”yyyy-MM-”+maxDay; System。n((e(;

求两个日期之间相隔的天数:

java。DateFormat format = new java。text。SimpleDateFormat("yyyy-MM—dd”;

。Date beginDate= format。parse(”2007—12-24";

java。util。Date endDate= (”2007-12—25";

long day=(e(—mydate。getTime(/(24*60*60*1000;

n("相隔的天数=”+day;

一年前的日期:

java。text。Format formatter=new java。DateFormat(”yyyy-MM—dd”;

java。util。Date todayDate=new java。(;

long beforeTime=(e(/1000-60*60*24*365;

todayDate。setTime(beforeTime*1000;

String beforeDate=(todayDate;

n(beforeDate;

一年后的日期:

java。text。Format formatter=new DateFormat("yyyy-MM—dd";

。Date todayDate=new 。Date(;

long afterTime=(e(/1000+60*60*24*365;

e(afterTime*1000;

String afterDate=(todayDate;

。println(afterDate;

求10小时后的时间

java。util。Calendar Cal=。Calendar。getInstance(;

e(dateOper;

(java。_OF_DAY,10;

n(”date:”+(e(;

求10小时前的时间

java。util。Calendar Cal=java。ar。getInstance(;

Cal。setTime(dateOper;

Cal。add(java。_OF_DAY,-10;

System。n("date:”+(e(;

。sql。Date

继承自,是操作数据库用的日期类型

一个包装了毫秒值的瘦包装器(thin wrapper,它允许JDBC 将毫秒值标识为SQL DATE 值。毫秒值表示自1970 年 1 月 1 日00:00:00 GMT 以来经过的毫秒数。为了与SQL DATE 的定义一致,由 实例包装的毫秒值必须通过将时间、分钟、秒和毫秒设置为与该实例相关的特定时区中的零来“规范化”。

java。sql。Date sqlDate = new (f(”2007—12—25”。getTime(;

日期比较:简单的比较可以以字符串的形式直接比较,也可使用

。valueOf("2007—03—08".compareTo(f("2007-03-18"方式来比较日期的大小。也可使用。(java。来比较.

。GregorianCalendar

GregorianCalendar 是Calendar 的一个具体子类,提供了世界上大多数国家/地区使用的标准日历系统。

GregorianCalendar 是一种混合日历,在单一间断性的支持下同时支持儒略历和格里高利历系统,在默认情况下,它对应格里高利日历创立时的格里高利历日期(某些国家/地区是在1582 年10 月15 日创立,在其他国家/地区要晚一些。可由调用方通过调用setGregorianChange(来更改起始日期。

历史上,在那些首先采用格里高利历的国家/地区中,1582 年10 月 4 日(儒略历之后就是1582 年10 月15 日(格里高利历。此日历正确地模拟了这些变化。在开始格里高利历之前,GregorianCalendar 实现的是儒略历。格里高利历和儒略历之间的惟一区别就是闰年规则.儒略历指定每4 年就为闰年,而格里高利历则忽略不能被400 整除的世纪年。

GregorianCalendar 可实现预期的格里高利历和儒略历。也就是说,可以通过在时间上无限地向后或向前外推当前规则来计算日期。因此,对于所有的年份,都可

以使用GregorianCalendar 来生成有意义并且一致的结果.但是,采用现代儒略历规则时,使用

GregorianCalendar 得到的日期只在历史上从公元4 年3 月1 日之后是准确的。在此日期之前,闰年规则的应用没有规则性,在45 BC 之前,甚至不存在儒略历.

在格里高利历创立以前,新年是3 月25 日。为了避免混淆,此日历始终使用 1 月

1 日为新年。如果想要格里高利历转换之前并且处于 1 月 1 日和3 月24 日之间的日期,则可以进行手动调整。

为WEEK_OF_YEAR 字段所计算的值的范围从 1 到53.一年的第一个星期始于getFirstDayOfWeek( 的最早7 天,至少包含该年的getMinimalDaysInFirstWeek( 各天。这取决于getMinimalDaysInFirstWeek(、getFirstDayOfWeek( 的值以及1

月1 日是星期几。一年的第一个星期和下一年的第一个星期之间的各个星期按顺序从2 到52 或53(根据需要进行编号.

例如,1998 年1 月1 日是星期四。如果getFirstDayOfWeek( 为MONDAY,并且getMinimalDaysInFirstWeek( 为4(这些值反映了ISO 8601 和很多国家/地区标准,则1998 年的第一个星期开始于1997 年12 月29 日,结束于1998 年1 月4 日。但是,如果getFirstDayOfWeek( 为SUNDAY,那么1998 年的第一个星期开始于1998

年1 月4 日,结束于1998 年1 月10 日;1998 年头三天是1997 年第53 个星期的一部分。

为WEEK_OF_MONTH 字段所计算的值的范围从0 到6。一个月的第一个星期(WEEK_OF_MONTH = 1 的日期是该月至少连续getMinimalDaysInFirstWeek( 天中的最早日期,结束于getFirstDayOfWeek( 的前一天。与一年的第一个星期不同,一个月的第一个星期可能短于7 天,也不必从getFirstDayOfWeek( 这一天开始,并且不包括前一个月的日期。在第一个星期之前该月日期的WEEK_OF_MONTH 为0.

5. 。DateFormat

DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并分析日期或时间.日期/时间格式化子类(如SimpleDateFormat允许进行格式化(也就是日期-> 文本、分析(文本-> 日期和标准化。将日期表示为Date 对象,或者表示为从GMT(格林尼治标准时间1970 年,1 月1 日00:00:00 这一刻开始的毫秒数。

DateFormat 提供了很多类方法,以获得基于默认或给定语言环境和多种格式化风格的默认日期/时间Formatter。格式化风格包括FULL、LONG、MEDIUM 和SHORT。方法描述中提供了使用这些风格的更多细节和示例。

DateFormat 可帮助进行格式化并分析任何语言环境的日期。对于月、星期,甚至日历格式(阴历和阳历,其代码可完全与语言环境的约定无关。

要格式化一个当前语言环境下的日期,可使用某个静态工厂方法:

myString = eInstance(.format(myDate;

如果格式化多个日期,那么获得该格式并多次使用它是更为高效的做法,这样系统就不必多次获取有关环境语言和国家/地区约定的信息了。

DateFormat df = DateFormat。getDateInstance(;

for (int i = 0; i 〈 ; ++i {

n((myDate[i] + "; ";

}

要格式化不同语言环境的日期,可在getDateInstance( 的调用中指定它。

DateFormat df = DateFormat。getDateInstance(, Locale。FRANCE;

还可使用DateFormat 进行分析。

myDate = (myString;

使用getDateInstance 来获得该国家/地区的标准日期格式。另外还提供了一些其他静态工厂方法。使用getTimeInstance 可获得该国家/地区的时间格式。使用getDateTimeInstance 可获得日期和时间格式.可以将不同选项传入这些工厂方法,以控制结果的长度(从SHORT 到MEDIUM 到LONG 再到FULL。确切的结果取决于语言环境,但是通常:

∙SHORT 完全为数字,如12.13.52 或3:30pm

∙MEDIUM 较长,如Jan 12, 1952

∙LONG 更长,如January 12, 1952 或3:30:32pm

∙FULL 是完全指定,如Tuesday, April 12, 1952 AD 或3:30:42pm PST。

如果愿意,还可以在格式上设置时区。如果想对格式化或分析施加更多的控制(或者给予用户更多的控制,可以尝试将从工厂方法所获得的DateFormat 强制转换为SimpleDateFormat。这适用于大多数国家/地区;只是要记住将其放入一个try

代码块中,以防遇到特殊的格式。

还可以使用借助ParsePosition 和FieldPosition 的分析和格式化方法形式来

∙逐步地分析字符串的各部分。

∙对齐任意特定的字段,或者找出字符串在屏幕上的选择位置。

6. 。SimpleDateFormat

SimpleDateFormat 是一个以与语言环境相关的方式来格式化和分析日期的具体类。它允许进行格式化(日期—> 文本、分析(文本—> 日期和规范化。

SimpleDateFormat 使得可以选择任何用户定义的日期-时间格式的模式.但是,仍然建议通过DateFormat 中的getTimeInstance、getDateInstance 或

getDateTimeInstance 来新的创建日期-时间格式化程序。每一个这样的类方法都能够返回一个以默认格式模式初始化的日期/时间格式化程序。可以根据需要使用applyPattern 方法来修改格式模式.有关使用这些方法的更多信息,请参阅DateFormat。

日期和时间模式 日期和时间格式由日期和时间模式 字符串指定。在日期和时间模式字符串中,未加引号的 字母 ’A' 到 'Z' 和 'a' 到 'z' 被解释为模式字母,用来表示日期或时间字符串元素.文本可 以使用单引号 (' 引起来,以免进行解释.”'’” 表示单引号。所有其他字符均不解释;只是 在格式化时将它们简单复制到输出字符串,或者在分析时与输入字符串进行匹配。 定义了以下模式字母(所有其他字符 'A'

到 ’Z' 和 ’a' 到 'z' 都被保留): 模式字母通常是重复的,其数量确定其精确表示: • • • Text: 对于格式化来说,如果模式字母的数量大于或等于 4,则使用完全形式;否 则,在可用的情况下使用短形式或缩写形式。对于分析来说,两种形式都是可接受 的,与模式字母的数量无关。 Number: 对于格式化来说,模式字母的数量是最小的数位,如果数位不够,则用 0 填充以达到此数量。对于分析来说,模式字母的数量被忽略,除非必须分开两个相 邻字段。 Year: 对于格式化来说,如果模式字母的数量为 2,则年份截取为 2 位数,否则将 年份解释为 number. 对于分析来说,如果模式字母的数量大于 2,则年份照字面意义进行解释,而不管 数位是多少。 因此使用模式 "MM/dd/yyyy",将 "01/11/12" 分析为公元 12 年 1 月 11 日。


本文标签: 使用 方法 时间 模式