Calendar是一个抽象类,主要用来操作日历时间字段。在java.util.Calendar包中,Calendar在开发中基本都会使用得到,这里对经常使用到的做个总结,也可能有遗漏,遇到再补,慢慢完善。
常用的方法
abstract void add(int field, int amount) |
此方法添加或减去指定的时间量,以给定日历字段,基于日历的规则。 |
boolean after(Object obj) |
这个方法返回当前日历是否代表在指定Object表示的时间之后的时间。 |
boolean before(Object when) |
这个方法返回当前日历是否代表在指定Object表示的时间之前的时间。 |
void clear() |
此方法设置此Calendar的所有日历字段值和时间值(毫秒从历元至偏移量)未定义。 |
Object clone() |
此方法创建并返回此对象的一个副本。 |
int compareTo(Calendar anotherCalendar) |
这个方法比较两个Calendar对象表示的时间值(从历元至毫秒偏移量)。 |
boolean equals(Object obj) |
这个方法使日历比较指定的对象。 |
int get(int field) |
此方法返回给定日历字段的值。 |
int getActualMaximum(int field) |
此方法返回指定日历字段可能拥有的最大值,鉴于此Calendar时间值。 |
int getActualMinimum(int field) |
此方法返回指定日历字段可能拥有的最小值,鉴于此Calendar时间值。 |
static Calendar getInstance() |
使用默认时区和语言环境这种方法获得一个日历。 |
static Calendar getInstance(Locale aLocale) |
使用默认时区和指定的区域设置此方法获取一个日历。 |
static Calendar getInstance(TimeZone zone) |
使用指定的时区和默认语言环境这种方法得到一个日历。 |
static Calendar getInstance(TimeZone zone, Locale aLocale) |
这种方法得到一个日历指定的时区和语言环境。 |
abstract int getMaximum(int field) |
此方法返回此Calendar实例给定日历字段的最大值。 |
abstract int getMinimum(int field) |
此方法返回此Calendar实例给定日历字段的最小值。 |
Date getTime() |
此方法返回表示此Calendar的时间值(从历元至“毫秒偏移量)的Date对象。 |
long getTimeInMillis() |
该方法以毫秒为单位返回此Calendar的时间值。 |
abstract void roll(int field, boolean up) |
此方法添加或减去(上/下)的时候一个单元在给定的时间字段不更改更大的字段。 |
void roll(int field, int amount) |
此方法将指定的(签署)金额至指定日历字段不更改更大的字段。 |
void set(int field, int value) |
此方法设置给定日历字段为给定值。 |
void set(int year, int month, int date) |
此方法设置为日历字段的值 YEAR, MONTH, and DAY_OF_MONTH.. |
void set(int year, int month, int date, int hourOfDay, int minute) |
此方法设置为日历字段的值YEAR, MONTH, DAY_OF_MONTH, HOUR_OF_DAY, 和 MINUTE. |
void set(int year, int month, int date, int hourOfDay, int minute, int second) |
此方法设置的字段的值YEAR, MONTH, DAY_OF_MONTH, HOUR, MINUTE, 和SECOND. |
常用的场景
1,获取今天或者之后多少天的日期
Calendar calendar=Calendar.getInstance();
@Test
public void getTest(){
calendar.setTime(new Date());
/*获取今天的日期*/
System.out.println("今天的日期是:"+calendar.get(Calendar.DAY_OF_MONTH));
/*获取十天之后的日期*/
calendar.clear();//避免继承当前系统的时间
calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH)+10);
System.out.println("十天之后的日期是:"+calendar.get(Calendar.DAY_OF_MONTH));
}
2,计算某个月的天数是多少
/*计算某一个月的天数是多少*/
public void maxDay(int year,int month){
calendar.clear();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH,month-1);//默认1月为0月
int day = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println(year+"年"+month+"月"+"的最大天数是:"+day);
}
@Test
public void maxDayTest(){
maxDay(2017,9);
}
3,计算某一天是该年或该月的第几个星期
public void weekNum(int year,int month,int day){
calendar.clear();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH,month-1);
calendar.set(Calendar.DAY_OF_MONTH, day);
/*计算某一天是该年的第几个星期*/
int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR);
System.out.println(year+"年"+month+"月"+day+"日是这年中的第"+weekOfYear+"个星期");
/*计算某一天是该月的第几个星期*/
int weekOfMonth= calendar.get(Calendar.WEEK_OF_MONTH);
System.out.println(year+"年"+month+"月"+day+"日是这个月中的第"+weekOfMonth+"个星期");
}
@Test
public void weekNumTest(){
weekNum(2017, 7, 8);
}
4,计算一年中的第几星期是几号
public void dayNum(int year,int week){
calendar.clear();
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.WEEK_OF_YEAR, week);
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println(df.format(calendar.getTime()));
}
@Test
public void dayNumTest(){
dayNum(2017,28);
}
5,查询显示当前的后几天,前几天等
public void add(int year,int month,int day,int num){
calendar.clear();
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month-1);
calendar.set(Calendar.DAY_OF_MONTH, day);
Date date=calendar.getTime();
calendar.add(Calendar.DATE, num);
date=calendar.getTime();
System.out.println(df.format(date));
}
/*使用场景比如,发找回密码邮件,设置一天后过期*/
@Test
public void addTest(){
add(2017,7,10,1);
}
roll()方法和add()方法用法一样,不过roll()方法是在本月循环,比如,七月三十一号加五天,add()方法结果是八月五号; roll()方法是七月五号,roll()方法用到的少,一般add()使用较多。测试roll()方法:
public void roll(int year,int month,int day,int num){
calendar.clear();
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month-1);
calendar.set(Calendar.DAY_OF_MONTH, day);
Date date=calendar.getTime();
calendar.roll(Calendar.DATE, num);
date=calendar.getTime();
System.out.println(df.format(date));
}
@Test
public void rollTest(){
roll(2017,7,31,5);
}
6,计算两个任意时间中间相隔的天数
public int getDaysBetween (Calendar day1, Calendar day2){
if (day1.after(day2)){
Calendar swap = day1;
day1 = day2;
day2 = swap;
}
int days = day2.get(Calendar.DAY_OF_YEAR) - day1.get(Calendar.DAY_OF_YEAR);
int y2 = day2.get(Calendar.YEAR);
if (day1.get(Calendar.YEAR) != y2){
day1 = (Calendar) day1.clone();
do{
days += day1.getActualMaximum(Calendar.DAY_OF_YEAR);//得到当年的实际天数
day1.add(Calendar.YEAR, 1);
} while (day1.get(Calendar.YEAR) != y2);
}
return days;
}
@Test
public void getDaysBetweenTest(){
Calendar calendar1=Calendar.getInstance();
Calendar calendar2=Calendar.getInstance();
calendar1.set(2017,07,30);
calendar2.set(2017,07,03);
int days=getDaysBetween(calendar1, calendar2);
System.out.println("相隔"+days+"天");
}
计算任意两个日期的相隔天数使用场景较多,如查询某个时间段注册的新用户,或者某个时间段内销售总额等等。