JAVA中 时间类Date、SimpleDateFormat、Calendar的用法和联系
开始学习java也有一段时间了,从今天开始整理一下学习的部分笔记和一些心得,一方面是用作备忘,可以时时查看,另一方面也算是一种对知识的巩固。
正如大家所知道的,想要玩好java中的时间,就需要熟练掌握Date、SimpleDateFormat、Calendar三个类的用法,首先对其进行一个简单的概述:
Date表示的是时间点,提供的long getTime()和setTime()方法分别用于获取时间毫秒数和设置Date类型对象的时间
SimpleDateFormat用于将时间转换成指定的格式,提供的String format()和Date parse()方法用于Date类型和String类型之间的转换
Calendar表示的日历,用于操作时间。其提供的Date getTime()和void setTime()方法用于Calendar与Date之间的转换,同时还提供了set和get方法,用于设置和获取当前的Calendar所表示的时间
接下来看一下这三个类使用和学习需要注意到的细节:
Date:
日期型
Date的每一个实例都可以表示一个确切的时间点,其内部维护了一个long类型的值,这个值所表示的是UTC时间(1970年1月1日 00:00:00)到当前时间点的毫秒数。
Date中主要为我们提供了两个方法:
getTime() 该方法用于获取Date类中维护的时间,也就是上述的时间毫秒数。
setTime(long time) 该方法用于将指定的时间毫秒数转为Date类型的数据。
简而言之,Date给我们提供的两个方法,就是用来将Date类型与毫秒数之间进行转换的。
下面是方法的使用举例:
/*
* 求出明天这个时间点的时间日期
*/
//获取当前时间日期
Date d1 = new Date();
//将当前时间日期转为long类型的时间毫秒数
long t1 = d1.getTime();
//加上24小时的毫秒数
t1 += 1000*60*60*24;
//将明天的时间毫秒数转为Date
d1.setTime(t1);//第一种方法,直接设置
System.out.println(d1);
Date d2 = new Date(t1);//第二种方法重新创建新的Date类型的对象用于接收
System.out.println(d2);
SimpleDateFormat:
顾名思义,这个类是用来进行简单日期转换的。
学习这个类需要我们记住日期的表达格式,同样也要能够熟练的使用两个方法。
首先看看自己是否熟记下列日期表达:
y 表示年
M 表示月
d 表示日
H 表示时(24小时制) h 表示时(12)小时制
m 表示分
s 表示秒
a 表示上/下午
E 表示周几
注意:
年一般是两个y或者4个y,其他例如月、日只需要一个相应的字母就能表示两位数,但多写一个(即写两个)可以让其是一位数的时候前面加“0”,例如“yyyy-M-d”与“yyyy-MM-dd”表示2000年10月10日都是一样的,但如果表示2000年1月1日分别就是“2000-1-1”和“2000-01-01”。
需要熟练使用的两个方法:
format(Date date) 此方法用于将给定的Date表示的时间按照当前SimpleDateFormat所描述的格式转为字符串
parse(String str) 该方法根据SimpleDateFormat指定的日期格式将给定的字符串解析为Date对象
简而言之,SimpleDateFormat主要是提供了一个日期表达的格式,不至于显示出来的是一个别扭的,或者是自己不熟悉的时间。而其提供的两个方法,是用于让时间在Date类型与String类型之间转换的,以此便于将接收到的用户输入的时间字符串转为Date类型参与后面的操作,同时也便于将操作完毕的Date日期转为String类型进行输出。
用法举例:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd E HH:mm:ss a");
Date date = new Date();
System.out.println();
String time = sdf.format(date);
System.out.println(time);
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
String str = "2008/08/08 20:08:08";
Date date1 = sdf1.parse(str);
System.out.println(date1);
Calendar:
日历,是一个抽象类,其中封装了格里高利历法,我们主要用它来对时间进行操作
由于抽象类不能被实例化,所以Calendar类内部给我们提供了一个静态方法让我们只需要调用这个方法就可以将其实例化:getInstance()
首先,Calendar中也给我们提供了setTime()和getTime()方法,但与Date类中不一样的是,此处的这两个方法是用来将Calendar与Date进行转换的,下面是这两个方法的用法:
//实例化Calendar,得到的默认就是当前系统时间
Calendar calendar = Calendar.getInstance();//推荐使用
System.out.println(calendar);
/*
* getTime()
* 该方法可以将当前Calendar表示的时间以Date形式返回
*/
Date date = calendar.getTime();
System.out.println(date);
long time = calendar.getTime().getTime();//获取时间毫秒数
System.out.println(time);
/*
* setTime(Date date)
* 该方法允许当前Calendar表示给定的Date所表示的时间
*/
calendar.setTime(new Date());
System.out.println(calendar);
另外,Calendar还单独给了一个set和一个get方法(准确的说应该分别是一类方法,其中包含多个重载方法),set用来设置Calendar中时间分量的值,get用来获取这些值,下面直接看两个方法的用法:
set方法:
public static void main(String[] args) {
/*
* 希望当前Calendar描述以下时间
* 2008-08-08 20:08:08
*/
Calendar calendar = Calendar.getInstance();
//设置年
calendar.set(calendar.YEAR, 2008);
//设置月
calendar.set(calendar.MONTH, 7);
//设置日
calendar.set(calendar.DAY_OF_MONTH, 8);
//设置时分秒此处略去
calendar.set(2008, 7, 8, 20, 8, 8);//一次性设置的语句
System.out.println(calendar);
String time = new SimpleDateFormat("yyy-MM-dd HH:mm:ss E").format(calendar.getTime());
System.out.println(time);
}
get方法:
public static void main(String[] args) {
//获取一个Calendar实例
Calendar calendar = Calendar.getInstance();
//获取年
int year = calendar.get(Calendar.YEAR);
System.out.println(year);
//获取月 月份是从0开始的,所以需要+1
int month = calendar.get(Calendar.MONTH);
System.out.println(month+1);
//获取日
int day = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(day);
//获取时
int hour = calendar.get(Calendar.HOUR_OF_DAY);
System.out.println(hour);
//获取分
int minute = calendar.get(Calendar.MINUTE);
System.out.println(minute);
}
还有一个特殊的get方法,getMax可以获取当前Calendar表示的时间中指定时间分量所允许的最大值,一般只在年和月中使用,比如做日历的时候需要让其自动计算每年和每月的天数。
该方法的使用如下:
public static void main(String[] args) {
//获取一个Calnedar实例
Calendar calendar = Calendar.getInstance();
//获取这一年中一共有多少天
int days_of_year = calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
System.out.println(days_of_year);
//获取该月中一共有多少天
int day_of_month = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println(day_of_month);
}
在最开始我们便说了Calendar是用来操作时间的,但上述方法好像都没有达到这一目的,所以我们再学习最后一个方法:add(int filed,int value)
Calendar中的方法掌握以上这些就足够了,以下是add方法的用法举例:
public static void main(String[] args) {
//获取当前的Calendar
Calendar calendar = Calendar.getInstance();
Date date = calendar.getTime();
System.out.println(date);
//五天后是哪一天
calendar.add(Calendar.DAY_OF_YEAR, 5);
Date date1 = calendar.getTime();
System.out.println(date1);
//五天前是哪一天
calendar.add(Calendar.DAY_OF_YEAR, -5);
Date date2 = calendar.getTime();
System.out.println(date2);
}
关于Calendar类中需要注意的:
月是从0开始的,即0表示一月,1表示二月……
HOUR_OF_DAY 24小时制
HOUR 12小时制
DAY_OF_YEAR 相对于年的日 即一年的第几天
DAY_OF_MONTH 相对于月的日 即几号
DAY_OF_WEEK 相对于周的日 即周几(周日为第一天,即1表示周日,0表示周六,7也可以表示周六)
DATE == DAY_OF_MONTH
最后关于这三个类做一下小小的总结:
简而言之,可以理解为毫秒