`
haohao-xuexi02
  • 浏览: 216425 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA处理日期时间常用方法: java.util.Calendar --转

阅读更多
  忘知识点太快了。今天总结了,只要不适用,明天就忘记了。人不服老不行了。

原文:http://hi.baidu.com/nepiphyllum/blog/item/dc4a2d329b6b8bfe1a4cff05.html
Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。

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

cal.add(Calendar.DAY_OF_MONTH, -1);//取当前日期的前一天.

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

//通过格式化输出日期

java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd");

System.out.println("Today is:"+format.format(Calendar.getInstance().getTime()));

System.out.println("yesterday is:"+format.format(cal.getTime()));

得到2007-12-25日期: Calendar calendar = new GregorianCalendar(2007, 11, 25,0,0,0);

Date date = calendar.getTime();System.out.println("2007 Christmas is:"+format.format(date)); //java月份是从0-11,月份设置时要减1.

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

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

int month=calendar.get(Calendar.MONTH)+1;

int day =calendar.get(Calendar.DAY_OF_MONTH);

int hour =calendar.get(Calendar.HOUR_OF_DAY);

int minute =calendar.get(Calendar.MINUTE);

int seconds =calendar.get(Calendar.SECOND);

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

Calendar cal = Calendar.getInstance();

int day=cal.getActualMaximum(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 p.m. 的时间是 12 点。
分钟按通常方式由 0 至 59 的整数表示。
秒由 0 至 61 的整数表示;值 60 和 61 只对闰秒发生,尽管那样,也只用在实际正确跟踪闰秒的 Java 实现中。于按当前引入闰秒的方式,两个闰秒在同一分钟内发生是极不可能的,但此规范遵循 ISO C 的日期和时间约定。

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

java.util.Date today=new java.util.Date();

System.out.println("Today is "+formats.format(today));

取当月的第一天:

java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-01");

java.util.Date firstDay=new java.util.Date();

System.out.println("the month first day is "+formats.format(firstDay));

取当月的最后一天:

Calendar cal = Calendar.getInstance();

int maxDay=cals.getActualMaximum(Calendar.DAY_OF_MONTH);

java.text.Format formatter3=new java.text.SimpleDateFormat("yyyy-MM-"+maxDay);

System.out.println(formatter3.format(cal.getTime()));

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

java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd");

java.util.Date beginDate= format.parse("2007-12-24");

java.util.Date endDate= format.parse("2007-12-25");

long day=(date.getTime()-mydate.getTime())/(24*60*60*1000);

System.out.println("相隔的天数="+day);

一年前的日期:

java.text.Format formatter=new java.text.SimpleDateFormat("yyyy-MM-dd");

java.util.Date todayDate=new java.util.Date();

long beforeTime=(todayDate.getTime()/1000)-60*60*24*365;

todayDate.setTime(beforeTime*1000);

String beforeDate=formatter.format(todayDate);

System.out.println(beforeDate);

一年后的日期:

java.text.Format formatter=new java.text.SimpleDateFormat("yyyy-MM-dd");

java.util.Date todayDate=new java.util.Date();

long afterTime=(todayDate.getTime()/1000)+60*60*24*365;

todayDate.setTime(afterTime*1000);

String afterDate=formatter.format(todayDate);

System.out.println(afterDate);

求10小时后的时间

java.util.Calendar Cal=java.util.Calendar.getInstance();

Cal.setTime(dateOper);

Cal.add(java.util.Calendar.HOUR_OF_DAY,10);

System.out.println("date:"+forma.format(Cal.getTime()));

求10小时前的时间

java.util.Calendar Cal=java.util.Calendar.getInstance();

Cal.setTime(dateOper);

Cal.add(java.util.Calendar.HOUR_OF_DAY,-10);

System.out.println("date:"+forma.format(Cal.getTime()));

3.java.sql.Date

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

一个包装了毫秒值的瘦包装器 (thin wrapper),它允许 JDBC 将毫秒值标识为 SQL

DATE

值。毫秒值表示自 1970 年 1 月 1 日 00:00:00 GMT 以来经过的毫秒数。为了与 SQL

DATE

的定义一致,由

java.sql.Date

实例包装的毫秒值必须通过将时间、分钟、秒和毫秒设置为与该实例相关的特定时区中的零来“规范化”。

java.sql.Date sqlDate = new java.sql.Date(java.sql.Date.valueOf("2007-12-25").getTime());

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

java.sql.Date.valueOf("2007-03-08").compareTo(java.sql.Date.valueOf("2007-03-18"))方式来比较日期的大小.也可使用java.util.Date.after(java.util.Date)来比较.

4.java.util.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. java.text.DateFormat

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

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

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

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

myString = DateFormat.getDateInstance().format(myDate);

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

DateFormat df = DateFormat.getDateInstance();

for (int i = 0; i < myDate.length; ++i) {

    output.println(df.format(myDate[i]) + "; ");

}

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

DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.FRANCE);

还可使用 DateFormat 进行分析。

myDate = df.parse(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. java.text.SimpleDateFormat

SimpleDateFormat

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

SimpleDateFormat

使得可以选择任何用户定义的日期-时间格式的模式。但是,仍然建议通过

DateFormat

中的

getTimeInstance



getDateInstance



getDateTimeInstance

来新的创建日期-时间格式化程序。每一个这样的类方法都能够返回一个以默认格式模式初始化的日期/时间格式化程序。可以根据需要使用

applyPattern

方法来修改格式模式。有关使用这些方法的更多信息,请参阅

DateFormat



日期和时间模式

日期和时间格式由日期和时间模式 字符串指定。在日期和时间模式字符串中,未加引号的字母

'A'



'Z'



'a'



'z'

被解释为模式字母,用来表示日期或时间字符串元素。文本可以使用单引号 (

'

) 引起来,以免进行解释。

"''"

表示单引号。所有其他字符均不解释;只是在格式化时将它们简单复制到输出字符串,或者在分析时与输入字符串进行匹配。

定义了以下模式字母(所有其他字符

'A'



'Z'



'a'



'z'

都被保留):

模式字母通常是重复的,其数量确定其精确表示:

number。

对于分析来说,如果模式字母的数量大于 2,则年份照字面意义进行解释,而不管数位是多少。因此使用模式 "MM/dd/yyyy",将 "01/11/12" 分析为公元 12 年 1 月 11 日。

分享到:
评论
2 楼 haohao-xuexi02 2011-05-31  
xiang37 写道
师太,你老了么?

一边玩去。。。
1 楼 xiang37 2011-05-31  
师太,你老了么?

相关推荐

    Java时间转换

    在Java中,日期和时间可以使用java.util.Date类和java.util.Calendar类来表示。这些类提供了多种方法来操作日期和时间,包括获取当前时间、将日期和时间转换为字符串、将字符串转换为日期和时间等。 在Java时间转换...

    java.util.Calendar求日期

    在Java编程语言中,`java.util.Calendar`类是处理日期和时间的重要工具之一。通过`Calendar`类,我们可以轻松地获取、操作和解析日期及时间数据。本文将深入探讨如何利用`java.util.Calendar`来计算特定日期,如今天...

    JAVA处理日期时间常用方法

    在Java中,主要使用`java.util.Date`、`java.util.Calendar`和`java.text.SimpleDateFormat`这三个核心类来处理日期时间。 首先,`java.util.Calendar`是一个抽象类,它提供了对日期和时间的高级操作。例如,你可以...

    java.util.Date与java.sql.Date互转及字符串转换为日期时间格式[文].pdf

    Java.util.Date与java.sql.Date的互转及字符串转换为日期时间格式 java.util.Date和java.sql.Date是Java中两个常用的日期时间类,分别属于不同的包。java.util.Date是Java标准库中的日期时间类,而java.sql.Date是...

    java API 在包java.util中有一个GregorianCalendar类,使用它可以得到一年内某个月的日历.zip

    这个类是基于格里高利历(公历)的,是Java中最常用的日期时间类之一。在给定的压缩包文件中,可能包含了关于如何使用`GregorianCalendar`来获取一年内特定月份的日历信息的练习代码,如`Exercise6_6.java`,以及...

    java日期时间转换大全

    Java提供了相应的API,如`Calendar`类和`java.time`包下的`Instant`、`LocalDate`和`LocalTime`类,用于更高级的日期时间处理。 总之,Java提供了丰富的工具和类库来处理日期和时间,包括但不限于`java.util.Date`...

    欧柏泰克:Java常用类库--日期操作类

    在 Java 语言中,日期操作类是非常重要的一部分,常用的日期操作类有 Date 类、Calendar 类和 DateFormat 类。下面是对这三个类的详细介绍: Date 类 Date 类是 Java 语言中最基本的日期操作类,位于 java.util ...

    精品专题(2021-2022年收藏)JAVA处理日期时间常用方法.doc

    总的来说,Java处理日期时间的方法包括创建`Calendar`实例、修改日期字段、格式化日期输出、以及使用`SimpleDateFormat`进行日期的解析和展示。理解这些基本概念对于任何Java开发者来说都是至关重要的,特别是在处理...

    java常用工具类

    - `java.util.Arrays`:处理数组的各种方法,如排序、复制、填充等。 9. **反射工具类**: - `java.lang.reflect`包:包含`Class`, `Field`, `Method`, `Constructor`等类,用于运行时检查和操作类、接口、字段和...

    java 日期操作工具类:包括计算两个时间相差距离多少天多少小时多少分多少秒

    - 在Java中,日期和时间的处理主要依赖于`java.util.Date`、`java.util.Calendar`以及从Java 8开始引入的`java.time`包。本工具类可能使用了这些API来创建、修改和比较日期对象。 2. **日期对象创建**: - `java....

    《Java设计模式》课后习题参考答案-刘伟(20180723).pdf

    - java.util.Calendar#getInstance(),获取日历对象的实例。 - java.util.Arrays#asList(),返回一个固定大小的列表。 - java.util.ResourceBundle#getBundle(),加载资源束。 ***.URL#openConnection(),创建一...

    java日期处理小结

    本篇文章主要总结了Java中关于日期处理的基础知识,包括`java.util.Calendar`,`java.util.GregorianCalendar`以及`java.util.Date`这三个核心类。 首先,我们来看`java.util.Date`类。`Date`类是用于表示特定瞬间...

    Java Date Time教程-java.util.Date

    Java的java.util.Date类是Java初的时间类之一。该类的大部分方法已不推荐使用,取而代之的...  你可以通过getTime()方法访问java.util.Date实例的日期和时间,比如像这样:  java.util.Date date = new java.util.D

    语言程序设计资料:JAVA时钟.doc

    - `java.util.Calendar` 和 `java.util.GregorianCalendar`:用于获取当前时间。 2. **类定义**: - 类`Clock`继承自`JFrame`,`JFrame`是Swing中的一个顶级容器,可以用来创建窗口。 - 实现`ActionListener`...

    java-util包资料

    - **Java 8后的新日期时间API**:`java.time`包下的`LocalDate`, `LocalTime`, `LocalDateTime`, `ZonedDateTime`等,提供了更强大、更易用的日期和时间处理功能。 4. **泛型**: - 自Java 5引入,提高了类型安全...

    jdk-java-version-1.8.0.45.rar

    6. **日期与时间API**:Java 8引入了全新的`java.time`包,替代了过时的`java.util.Date`和`java.util.Calendar`,提供了更好的日期和时间处理功能。 7. ** Nashorn JavaScript引擎**:JDK 1.8中内置了一个Nashorn ...

    Java中日期处理的代码

    在 Java 中处理日期时,我们需要导入一些必要的包来支持日期时间的格式化、解析等功能。示例代码中导入了如下几个关键的包: - `java.text.ParsePosition`:用于跟踪解析过程中的位置。 - `java.text....

    java日期时间操作函数代码

    6. **日期时间转换**:在旧API和新API之间转换,可以使用`java.time`中的`java.util.Date`和`java.util.Calendar`的转换方法,如`java.util.Date.from(Instant.now())`或`LocalDateTime.ofInstant(Instant.now(), ...

    java 中Calendar日期格式的转换

    `Calendar`类是抽象的,因此我们通常通过其子类如`GregorianCalendar`来创建实例并进行日期时间的操作。本文将深入探讨如何利用`Calendar`类进行日期格式的转换,以及如何在Java中有效地处理日期和时间。 ### 1. `...

    java.util源码-java-util:javautil源代码

    这个包提供了各种数据结构(如ArrayList、LinkedList、HashSet、HashMap)、集合框架、日期时间处理、随机数生成、IO流的辅助工具、事件模型、线程管理以及与本地化相关的功能。下面我们将深入探讨`java.util`包中的...

Global site tag (gtag.js) - Google Analytics