java日期操作专题

来源:互联网 发布:婚庆策划软件 编辑:程序博客网 时间:2024/04/29 06:33
1、时间日期

1)java中的时间类有:DateCalendar

3) 时间的标准有两种
 (1970)GMT long
 (0)UTC long
4) java中基本的时间表示GMT long
5) java提供了Date类型表示时间和日期
 Date 是long 类型的包装
6) Calendar 是历法的抽象
 历法:公历,农历,太阳历
7) GregorianCalendar是历法的实现,采用公历的算法实现的
 Calendar cal = Calendar.getInstance();
 Calendar cal = new GregorianCalendar();//除了日本和泰国,效果等同于上一句
8) Date和 Calendar的默认值就是系统当前时间



所以在对日期操作时,基本选的 Calendar类(抽象类),

 Calendar cal = Calendar.getInstance();//得到一个Calendar类的实例

Date nowTime = cal.getTime();//当前时间

1、将Date类型的日期,得到其Calendar对象

voidsetTime(Date date)

使用给定的 Date 设置此 Calendar 的时间。

2、对日期加减等运算,用Calendar非常方便.只要对calendar对象中的相应field比较熟悉,(包括对某个日期,年、月、日、时、分、秒的操作)

abstract voidadd(int field, int amount) 
根据日历的规则,为给定的日历字段添加或减去指定的时间量。3、设定某个field的值

voidset(int field, int value)
将给定的日历字段设置为给定值。4、取得某个field的值

intget(int field)
返回给定日历字段的值。

以下列出常用的对field的操作。方便的去得某个Date对应的年、月(从0开始)、日、时、分、秒、毫秒等。


Calendar calendar = Calendar.getInstance();
System.out.println(calendar);
System.out.println(calendar.get(Calendar.ERA));
System.out.println(calendar.get(Calendar.YEAR));
//calendar.set(Calendar.YEAR, 2014);
//calendar.set(Calendar.MONTH, 2);//1月为0 2月为1..依次类推
//calendar.set(Calendar.DATE, 31);
System.out.println("------日期相关------");
System.out.println(calendar.get(Calendar.YEAR));//年
System.out.println(calendar.get(Calendar.MONTH));//月 0 为1月,1为2月 ,2为3月
System.out.println(calendar.get(Calendar.DATE));//日此月的第几天,第一天为1
System.out.println(calendar.get(Calendar.HOUR));//时
System.out.println(calendar.get(Calendar.MINUTE));//分
System.out.println(calendar.get(Calendar.SECOND));//秒
System.out.println(calendar.get(Calendar.MILLISECOND));//毫秒
System.out.println("------------");
System.out.println(calendar.get(Calendar.WEEK_OF_YEAR));
System.out.println(calendar.get(Calendar.WEEK_OF_MONTH));
System.out.println("------------");
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));//与DATE同义
System.out.println(calendar.get(Calendar.DAY_OF_WEEK));//返回当前日期是一周的第几天,周日为第一天
System.out.println(calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH));//一个月的第几周
System.out.println("-----------");
System.out.println(calendar.get(Calendar.AM_PM));//
System.out.println("-----------");
System.out.println(calendar.getDisplayName(Calendar.MONTH, Calendar.SHORT, new Locale("en")));//
System.out.println(calendar.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault()));//


System.out.println(calendar.getTime());
System.out.println(new Date());
calendar.set(Calendar.DATE,30);
calendar.add(Calendar.DATE, -3);//calendar代表的日期-3天
calendar.add(Calendar.DATE, 3);//calendar代表的日期+3天,超过当前月自动顺延到下月
System.out.println(calendar.getTime());

字段操作(摘自 JDK文档,项目中遇到过此类bug,所以拿出来单独说明)

可以使用三种方法更改日历字段: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(),根据是否会影响更大的字段,用户界面可以像大多数用户所期望的那样运行。

注意以上区别避免出现错误。


DateFormat类

DateFormat是对日期和时间格式化的一个抽象,提供日期的格式化与解析

常用操作:

将字符串转解析为日期(字符串----》日期)(然后再得到对应的Calendar实例,就可以用此操作格式化的日期了)

Dateparse(String source)
从给定字符串的开始解析文本,以生成一个日期。

将日期转换为字符串(日期----》》》字符串)

Stringformat(Date date)
将一个 Date 格式化为日期/时间字符串。



0 0
原创粉丝点击