最近在程序中遇到了一些需要对日期进行操作的问题,在解决问题的同时,也顺便复习巩固下日期类的一些方法:Date、SimpleDateFormat、Calendar。
一:三大类的基本概念、部分常用方法介绍与举例
(1)Date:表示特定的瞬间,精确到毫秒(因为闰秒的原因,所以其实结果并不是特别的准确,但是如果要求不是特别严格,影响并没有很大。)
构造方法:Date()、Date(Long date)
常用方法:
void setTime(Long time):根据毫秒数设置该日期对象,默认构造函数设置该日期对象为当前日期。
Long getTime():获取日期对象毫秒数。毫秒数都是以1970年1月1日0点0分0秒开始计算。
(下面几个方法,在源代码中,实际比较的还是两个日期的毫秒数)
int compareTo(Date date):比较俩个日期顺序,比参数date小,返回负数,相等返回0,大则返回正数。
boolean before(Date date):判断是否在参数date之前,是则返回true。
boolean after(Date date):同上,判断在是否在参数之后。
boolean equals(Object date):当且仅当date不为空,是Date对象,而且毫秒数与调用方法的日期对象相等才为true。
(2)SimpleDateFormat:继承DateFormat类,主要用来进行格式转换。
构造函数:SimpleDateFormat(String pattern),最常用的构造方法。根据指定格式来转换字符串与日期。
常用的俩个格式转换方法:字符串转换成Date类:Date parse(String date)、Date类转换成字符串类型:String format(Date date),都是继承DateFormat类的方法。其中,parse方法会抛出一个转换异常:
public Date parse(String source) throws ParseException
{
ParsePosition pos = new ParsePosition(0);
Date result = parse(source, pos);
if (pos.index == 0)
throw new ParseException("Unparseable date: \"" + source + "\"" ,
pos.errorIndex);
return result;
}
下面是一个转换的例子:
public static void main(String[] args) throws ParseException {
//对字符串格式类似为2018-09这种进行转换,年月之间用‘-’分隔
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM");
Date date=(Date)simpleDateFormat.parse("2018-09");
System.out.println(date);
String dateStr=simpleDateFormat.format(date);
System.out.println(dateStr);
//将转换格式应用为201809这种,年月之间没有分隔符号的,只要年月相同,结果就与上面相同
simpleDateFormat.applyPattern("yyyyMM");
Date date2=(Date)simpleDateFormat.parse("201809");
System.out.println(date2);
String dateStr2=simpleDateFormat.format(date2);
System.out.println(dateStr2);
}
上面用到的applyPattern方法用来切换需要转换的字符串格式。
(3)Calendar:一个抽象类,为特定瞬间和一组日历字段之间的转换以及操作日历字段提供了方法。
使用Calendar.getInstance获取该对象:Calendar nowTime=Calendar.getInstance();
部分常用方法:
void setTime(Date date):通过该类方法指定Calendar对象表示的日期。
Date getTime():获取一个Date对象。
void setTimeInMillis(Long time):同上。
void add(int field,int amount):给当前对象的指定字段增加指定数值。Calender类为日历中的各种字段都设置了int类型的数值,比如,
public final static int YEAR = 1;
public final static int MONTH = 2;
public final static int WEEK_OF_YEAR = 3;
字段‘年’所对应的int值为1,如果你想将当前日历类对象的年份加1年,那么只需这样做:
Calendar nowTime=Calendar.getInstance();
System.out.println(nowTime.get(Calendar.YEAR));
nowTime.add(YEAR,1);
System.out.println(nowTime.get(Calendar.YEAR));
结果:
2018
2019
除了YEAR字段以外,还有其他很多字段,在这里就不一一列举出来了。
int compareTo(Calendar calendar):最终还是使用毫秒数来比较的。
boolean before(Object obj)、boolean after(Object obj):内部都是调用上面的compareTo方法实现。
二:实用
(1)一天的毫秒数:Long oneDay=Long.parseLong((24*60*60*1000)+"");
(2)接收的字符串格式的时间,转化为Date类型,并且获取对应的毫秒数:
public static void main(String[] args) throws ParseException {
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM");
Date date=(Date)simpleDateFormat.parse("2018-09");
//距离1970年1月1日的毫秒数
Long timeMilli=date.getTime();
System.out.println(date);
System.out.println(timeMilli);
}
结果:
Sat Sep 01 00:00:00 CST 2018
1535731200000
(3)获取指定年月份中指定月的天数,比如2018年9月有30天,返回结果就应该为30,8月就应该返回31
例子中,是通过传入字符串日期来进行计算的,如果能直接接收日期对象就少一个转换的过程
public static void main(String[] args) throws ParseException {
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
//将日期字符串转换为Date对象
Date date=(Date)simpleDateFormat.parse("2018-08-05");
//通过Date对象,创建一个日历对象
Calendar calendar=Calendar.getInstance();
calendar.setTime(date);
//通过日历中的字段,获取一个月的天数
Integer daysNumber=calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println(daysNumber);
Date date2=(Date)simpleDateFormat.parse("2018-09-05");
//通过Date对象,创建一个日历对象
calendar.setTime(date2);
//通过日历中的字段,获取一个月的天数
daysNumber=calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println(daysNumber);
}
结果:
31
30
同理,可以获取一年的天数等。
(4)获取对应日期的星期数
比如2018-08-19是星期天,就输出星期天,20号星期一就输出星期一
public static void main(String[] args) throws ParseException {
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
//将日期字符串转换为Date对象
Date date=(Date)simpleDateFormat.parse("2018-08-19");
//通过Date对象,创建一个日历对象
Calendar calendar=Calendar.getInstance();
calendar.setTime(date);
//获取当天对应的星期数,星期天为1,星期六为7,详见Calendar类的常量
Integer dayOfWeek=calendar.get(Calendar.DAY_OF_WEEK);
String dayOfWeekStr=null;
switch(dayOfWeek) {
case 1:
dayOfWeekStr="星期天";
break;
case 2:
dayOfWeekStr="星期一";
break;
case 3:
dayOfWeekStr="星期二";
break;
case 4:
dayOfWeekStr="星期三";
break;
case 5:
dayOfWeekStr="星期四";
break;
case 6:
dayOfWeekStr="星期五";
break;
case 7:
dayOfWeekStr="星期六";
break;
}
System.out.println(dayOfWeekStr);
}
结果:
星期天
总结:
SimpleDateFormat类用于转换格式,String←→Date;
Date类用于获取毫秒数,或者作为设置Calendar对象日期的参数,date.getTime()、calendar.setTime(date)
Calendar类用于具体操作,比如获取指定年、月的天数,日期对应的星期数,对应的月份数等。