1)java中的时间类有:Date和Calendar
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对象
void | setTime(Date date) 使用给定的 Date 设置此 Calendar 的时间。 |
2、对日期加减等运算,用Calendar非常方便.只要对calendar对象中的相应field比较熟悉,(包括对某个日期,年、月、日、时、分、秒的操作)
abstract void | add(int field, int amount) 根据日历的规则,为给定的日历字段添加或减去指定的时间量。 |
void | set(int field, int value) 将给定的日历字段设置为给定值。 |
int | get(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 规则 1 将 MONTH
字段设置为 September,因为向 August 添加 13 个月得出的就是下一年的 September。因为在 GregorianCalendar
中,DAY_OF_MONTH
不可能是 9 月 31 日,所以 add 规则 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()
,根据是否会影响更大的字段,用户界面可以像大多数用户所期望的那样运行。
注意以上区别避免出现错误。
DateFormat类
DateFormat是对日期和时间格式化的一个抽象,提供日期的格式化与解析
常用操作:
将字符串转解析为日期(字符串----》日期)(然后再得到对应的Calendar实例,就可以用此操作格式化的日期了)
Date | parse(String source) 从给定字符串的开始解析文本,以生成一个日期。 |
将日期转换为字符串(日期----》》》字符串)
String | format(Date date) 将一个 Date 格式化为日期/时间字符串。 |