下面列出了Java中用来处理时间日期的相关类,主要有Date、Calendar、DateFormat和SimpleDateFormat。其中,Date类可以代表当前时间和某个指定的时间,它提供了相关的方法用于对时间进行各种处理,但由于Date类不便于实现国际化,自从JDK1.1之后就逐渐被Calendar取代。Calendar是一个抽象类,它提供了可以将以毫秒为单位的时间转化为有用的分量的方法。Calendar不能使用构造方法,而要调用其静态方法getInstance(),然后调用相应的对象方法。如果想得到指定格式的日期时间值,可以使用DateFormat和SimpleDateFormat进行格式化。DateFormat是一个抽象类,可以对日期时间进行格式化处理,创建其对象必须使用工厂模式,不能直接使用new关键字。SimpleDateFormat是DateFormat的子类,他允许格式化(date—>text)、语法分析(text—>data)和标准化。
一、Date类
1.Date常用的构造方法
- public Date():分配Date对象并初始化此对象,以表示分配给他的时间(精确到毫秒)。
- public Date(long date):分配Date对象并初始化此对象,表示自从标准基准时间,称为“历元”(1970年1月1日00:00:00 GMT),以来的指定毫秒数。
2.Date常用的方法
- boolean after(Date when) 测试此日期是否在指定日期之后
- boolean before(Date when) 测试此日期是否在指定日期之前
- Object clone() 返回此对象的副本
- int CompareTo(Date anotherDate) 比较两个日期的顺序,如果参数Date等于此Date,则返回0;如果参数Date在此Date之前,则返回小于0的值;如果参数Date在此Date之后,则返回大于0的值。
- boolean equals(Object obj) 比较两个日期的相等性。当且仅当参数不为nul,并且是一个表示于此对象相同的时间点(到毫秒)的Date对象时,结果才为true。
- long getTime() 返回自1970年1月1日00:00:00GMT以来此Date对象表示的毫秒数
- void setTime(long time) 设置此Date对象,以表示1970年1月1日00:00:00GMT以后time毫秒的时间点
- String toString() 把此Date对象转换为字符串形式。
3.Date类应用
import java.util.Date;
public class DateText {
public static void main(String[] args) {
Date date = new Date();//实例化一个Date对象,代表当前时间点
System.out.println(date);//用toString()方法显示时间和日期
long msec = date.getTime();//得到日期的毫秒数
System.out.println("1970-1-1到现在的毫秒数时:" + msec);
}
}
二、Calendar类
1.使用Calendar类代表当前时间
由于Calendar类是抽象类,且Calendar类的构造方法是protected,所以无法使用Calendar类的构造方法来创建对象,API中提供了getInstance方法来创建对象。
使用该方法获得的Calendar对象就代表当前的系统时间,由于Calendar类的toString()方法实现方式并没有Date类直观,所以输出Calendar类的对象意义不大。
Calendar c = Calendar.getInstance();
2.使用Calendar类代表指定时间
Calendar c = Calendar.getInstance();
c1.set( 2017, 3 - 1, 9);
使用Calendar类代表特定的时间,需要首先创建一个Calendar的对象,然后再设定该对象当中的年月日参数。
public final void set( int year, int month, int date)
以上代码设置的时间为2017年3月9日,其参数的结构和Date类不一样。Calendar类当中年份的数值直接书写,月份的值为实际的月份-1,日期的值就是实际的日期值。
如果只设定某个字段,例如日期的值,则可以使用如下的set方法:
public void set(int field, int value)
在该方法中,参数field代表要设置的字段的类型,常见类型如下:
Calendar.Year——年份
Calendar.MONTH——月份
Calendar.DATE——日期
Calendar.DAY_OF_MONTH——日期,和上面的字段完全相同
Calendar.HOUR——12小时制的小时数
Calendar.HOUR_OF_DAY——24小时制的小时数
Calendar.MINUTE——分钟
Calendar.SECOND——秒
Calendar.DAY_OF_WEEK——星期几
后面的参数value代表设置成的值,如;
c1.set(Calendar.DATE , 10);
该代码的作用是将c1对象代表的时间中的日期设置为10,其他所有的数值会被重新计算,比如星期几以及对应的相对时间数值等。
3.获得Calendar类中的信息
Calendar c2 = Calendar.getInstance();
//年份
int year = c2.get(Calendar.YEAR);
//月份
int month = c2.get(Calendar.MONTH) + 1;
//日期
int date = c2.get(Calendar.DATE);
//小时
int hour = c2.get(Calendar.HOUR_OF_DAY);
//分钟
int minute = c2.get(Calendar.MINUTE);
//秒
int second = c2.get(Calendar.SECOND);
//星期几
int day = c2.get(Calendar.DAY_OF_WEEK);
使用Calendar类中的get方法可以获得Calendar对象中对应的信息
public int get(int field)
其中参数field代表需要获得的字段的值,字段说明和上面的set方法保持一致。需要说明的是,获得的月份为实际的月份值减1,获得的星期的值和Date类不一样。在Calendar类当中,周日是1,周一是2,周二是3,以此类推。
4.其他方法说明
(1)add()方法
public abstract void add(int field, int amount)
该方法的作用是在Calendar对象中的某个字段上增加或减少一定的数值,增加时,amount的值为正;减少时,amount的值为负。
例如:计算当前时间100天后的值
Calendar c3 = Calendar.getInstance();
c3.add(Calendar.DATE , 100);
int year1 = c3.get(Calendar.YEAR);
//月份
int month1 = c3.get(Calendar.MONTH) + 1;
//日期
int date1 = c3.get(Calendar.DATE);
System.out.println(year1 + "年" + month1 + "月" + date1 + "日");
这里add()方法是指在c3对象的Calendar.DATE,也就是日期字段上增加100,类内部会重新计算该日期对象中其他各字段的值,从而获得100天以后的值,上述程序的结果可能为:2009年6月17日
(2)after()方法
public boolean after(Object when)
该方法的作用是判断当前日期对象是否在when对象的后面,如果在when对象的后面则返回true,否则返回false。
Calendar c4 = Calendar.getInstance();
c4.set(2009 . 10 - 1, 10);
Calendar c5 = Calendar.getInstance();
c5.set(2010 . 10 - 1, 10);
boolean b = c5.after(c4);
System.out.println(b);
另外一个类似的方法是before(),他用于判断当前日期的对象是否位于另一个日期对象之前。
(3)getTime()方法
public final void getTime()
该方法的作用是将Calendar类型的对象转换为对应的Date类对象,两者代表相同的时间点。
类似方法是setTime()。该方法的作用是将Date对象转换为对应的Calendar对象
public final void setTime()
转换的示例代码
Date d = new Date();
Calendar c6 = Calendar.getInstance();
//Calendar对象转换为Date类型的对象
Date d1 = c6.getTime();
//Date类型的对象转换为Calendar对象
Calendar c7 = Calendar.getInstance();
c7.setTime(d);
5.使用Calendar对象表示当前的时间
分别输出不同格式的时间值,然后重新设置该Calendar的时间值,输出更新后的时间。
import java.util.Calendar;
public class CalendarText {
public static void main(String[] args) {
String[] months = {"Jan" , "Feb", "Mar", "Apr", "May", "jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
//获得一个Calendar实例,表示当前时间
Calendar calendar = Calendar.getInstance();
//输出当前的时间年月日格式;
System.out.println("Date:" + months[calendar.get(Calendar.MONTH)] + " " + calendar.get(Calendar.DATE) + " " + calendar.get(Calendar.YEAR));
//输出当前的时间时分秒格式
System.out.println("Time:" + calendar.get(Calendar.HOUR) + ":" + calendar.get(Calendar.MINUTE) + ":" + calendar.get(Calendar.SECOND));
//重新设置该时分秒
calendar.set(Calendar.HOUR , 20);
calendar.set(Calendar.MINUTE, 57);
calendar.set(Calendar.SECOND , 20);
//输出新设置的时间
System.out.println("Update time:" + calendar.get(Calendar.HOUR) + ":" + calendar.get(Calendar.MINUTE) + ":" + calendar.get(Calendar.SECOND));
}
}
三、DateFormat类
DateFormat提供了很多方法,利用它们可以获得基于默认或者给定语言环境和多种格式化风格的默认日期/时间Formater。格式化风格包括FULL、LONG、MEDIUM和SHORT。
DateFormat.SHORT:11/4/2009
DateFormat.MEDIUM:Nov 4,2009
DateForsat.FULL: Wednesday ,November 4, 2009
DateFormat.LONG: Wednesday 4,2009
因为DateFormat是抽象类,所以实例化对象的时候不能用new,而是通过工厂类方法返回DateEormat 实例。
DateFormat df = DateFormat.getDateInstance();
DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);
DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT , Locale.CHINA);
使用DateFormat类型可以在日期时间和字符串之间进行转换,例如,把字符串转换为一个Date对象,可以使用DateFormat的parse()方法,
DateFormat df = DateFormate.getDateTimeInstance();
Date new = df.parse("2011-05-28");
还可以使用DateForatformat()方法把一个Date对象转换为一个字符串,例如:
String strDate=df.format(new Date());
另外,使用9getTimeInstance可获得该国家的时间格式,使用getDateTimeInstance可获得日期和时间格式。
四、SimpleDateFormat类
1.日期的格式化
SimpleDateFormat类的format()方法可以将Date转换为指定日期格式的String,而parse()方法将String转换为Date.
System.out.println(new SimpleDateFormat("[yyyy-MM-dd hh:mm:ss:SSS]").format(new Date()));
此语句将输出;
[2009-11-04 09:45:45:419]
2.按照指定的格式把字符串解析为Date对象
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class DateFormatText {
public static void main(String[] args) {
time();
time2();
time3();
}
//获取现在的日期(24小时制)
public static void time() {
SimpleDateFormat sdf = new SimpleDateFormat();//格式化时间
sdf.applyPattern("yyyy-MM-dd HH:mm:ss a");//a为am/pm的标记
Date date = new Date();//获取当前时间
System.out.println("现在时间:" + sdf.format(date));
}
//获取现在的时间(12小时制)
public static void time2() {
SimpleDateFormat sdf = new SimpleDateFormat();//格式化时间
sdf.applyPattern("yyyy-MM-dd hh:mm:ss a");
Date date = new Date();
System.out.println("现在时间:" + sdf.format(date));
}
//获取5天后的日期
public static void time3() {
SimpleDateFormat sdf = new SimpleDateFormat();//格式化时间
sdf.applyPattern("yyyy-MM-dd HH:mm:ss a");
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE , 5);//将现在的日期加5天
Date date = calendar.getTime();
System.out.println("五天后的时间:" + sdf.format(date));
}
}