关于Calendar用法的一些总结

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,获取今天或者之后多少天的日期

[java]  view plain  copy
 print ?
  1. Calendar calendar=Calendar.getInstance();     
  2.       
  3.     @Test  
  4.     public void getTest(){  
  5.         calendar.setTime(new Date());  
  6.         /*获取今天的日期*/  
  7.         System.out.println("今天的日期是:"+calendar.get(Calendar.DAY_OF_MONTH));  
  8.         /*获取十天之后的日期*/  
  9.         calendar.clear();//避免继承当前系统的时间  
  10.         calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH)+10);  
  11.         System.out.println("十天之后的日期是:"+calendar.get(Calendar.DAY_OF_MONTH));  
  12.     }  
2,计算某个月的天数是多少
[java]  view plain  copy
 print ?
  1. /*计算某一个月的天数是多少*/  
  2.     public void maxDay(int year,int month){  
  3.         calendar.clear();  
  4.         calendar.set(Calendar.YEAR, year);  
  5.         calendar.set(Calendar.MONTH,month-1);//默认1月为0月  
  6.         int day = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);  
  7.         System.out.println(year+"年"+month+"月"+"的最大天数是:"+day);  
  8.     }  
  9.     @Test  
  10.     public void maxDayTest(){  
  11.         maxDay(2017,9);  
  12.     }  

3,计算某一天是该年或该月的第几个星期
[java]  view plain  copy
 print ?
  1. public void weekNum(int year,int month,int day){  
  2.         calendar.clear();  
  3.         calendar.set(Calendar.YEAR, year);  
  4.         calendar.set(Calendar.MONTH,month-1);  
  5.         calendar.set(Calendar.DAY_OF_MONTH, day);  
  6.         /*计算某一天是该年的第几个星期*/  
  7.         int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR);  
  8.         System.out.println(year+"年"+month+"月"+day+"日是这年中的第"+weekOfYear+"个星期");  
  9.         /*计算某一天是该月的第几个星期*/  
  10.         int weekOfMonth= calendar.get(Calendar.WEEK_OF_MONTH);  
  11.         System.out.println(year+"年"+month+"月"+day+"日是这个月中的第"+weekOfMonth+"个星期");  
  12.     }  
  13.     @Test  
  14.     public void weekNumTest(){  
  15.         weekNum(201778);  
  16.     }  

4,计算一年中的第几星期是几号
[java]  view plain  copy
 print ?
  1. public void dayNum(int year,int week){  
  2.     calendar.clear();  
  3.     SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");  
  4.     calendar.set(Calendar.YEAR, year);  
  5.     calendar.set(Calendar.WEEK_OF_YEAR, week);  
  6.     calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);  
  7.     System.out.println(df.format(calendar.getTime()));  
  8. }  
  9.   
  10. @Test  
  11. public void dayNumTest(){  
  12.     dayNum(2017,28);  
  13. }  
5,查询显示当前的后几天,前几天等
[java]  view plain  copy
 print ?
  1. public void add(int year,int month,int day,int num){  
  2.         calendar.clear();  
  3.         SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");  
  4.         calendar.set(Calendar.YEAR, year);  
  5.         calendar.set(Calendar.MONTH, month-1);  
  6.         calendar.set(Calendar.DAY_OF_MONTH, day);  
  7.         Date date=calendar.getTime();  
  8.         calendar.add(Calendar.DATE, num);  
  9.         date=calendar.getTime();  
  10.         System.out.println(df.format(date));  
  11.     }  
  12.     /*使用场景比如,发找回密码邮件,设置一天后过期*/  
  13.     @Test  
  14.     public void addTest(){  
  15.         add(2017,7,10,1);  
  16.     }  
roll()方法和add()方法用法一样,不过roll()方法是在本月循环,比如,七月三十一号加五天,add()方法结果是八月五号; roll()方法是七月五号,roll()方法用到的少,一般add()使用较多。测试roll()方法:
[java]  view plain  copy
 print ?
  1. public void roll(int year,int month,int day,int num){  
  2.         calendar.clear();  
  3.         SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");  
  4.         calendar.set(Calendar.YEAR, year);  
  5.         calendar.set(Calendar.MONTH, month-1);  
  6.         calendar.set(Calendar.DAY_OF_MONTH, day);  
  7.         Date date=calendar.getTime();  
  8.         calendar.roll(Calendar.DATE, num);  
  9.         date=calendar.getTime();  
  10.         System.out.println(df.format(date));  
  11.     }  
  12.     @Test  
  13.     public void rollTest(){  
  14.         roll(2017,7,31,5);  
  15.     }  

6,计算两个任意时间中间相隔的天数
[java]  view plain  copy
 print ?
  1. public int getDaysBetween (Calendar day1, Calendar day2){  
  2.             if (day1.after(day2)){  
  3.                 Calendar swap = day1;  
  4.                 day1 = day2;  
  5.                 day2 = swap;  
  6.             }  
  7.             int days = day2.get(Calendar.DAY_OF_YEAR) - day1.get(Calendar.DAY_OF_YEAR);  
  8.             int y2 = day2.get(Calendar.YEAR);  
  9.             if (day1.get(Calendar.YEAR) != y2){  
  10.                 day1 = (Calendar) day1.clone();  
  11.                 do{  
  12.                     days += day1.getActualMaximum(Calendar.DAY_OF_YEAR);//得到当年的实际天数  
  13.                     day1.add(Calendar.YEAR, 1);  
  14.                 } while (day1.get(Calendar.YEAR) != y2);  
  15.             }  
  16.             return days;  
  17.         }  
  18.      @Test  
  19.      public void getDaysBetweenTest(){  
  20.          Calendar calendar1=Calendar.getInstance();   
  21.          Calendar calendar2=Calendar.getInstance();   
  22.          calendar1.set(2017,07,30);  
  23.          calendar2.set(2017,07,03);  
  24.          int days=getDaysBetween(calendar1, calendar2);  
  25.          System.out.println("相隔"+days+"天");  
  26.      }  
计算任意两个日期的相隔天数使用场景较多,如查询某个时间段注册的新用户,或者某个时间段内销售总额等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值