欢迎光临
我们一起进阶

Java常用基础类(三):Calendar

扫码或搜索:沉默王二
发送 290992
即可立即永久解锁本站全部文章

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+"天");
     }

计算任意两个日期的相隔天数使用场景较多,如查询某个时间段注册的新用户,或者某个时间段内销售总额等等。

赞(0) 打赏
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

小白学堂,学的不止是技术,更是前程

关于我们免责声明

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏