Java常用基础类:Calendar

导读:本篇文章讲解 Java常用基础类:Calendar,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

Java常用基础类(二):Calendar


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.

常用的场景

获取今天或者之后多少天的日期

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));
}

计算某个月的天数是多少

/*计算某一个月的天数是多少*/
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(2019,9);
}

计算某一天是该年或该月的第几个星期

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(2019, 11, 11);
}
    

计算一年中的第几星期是几号

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(2019,26);
}

查询显示当前的后几天,前几天等

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(2019,11,10,1);
}

roll()方法和add()方法用法一样,不过roll()方法是在本月循环,比如,11月20号加五天,add()方法结果是?; roll()方法是11月5号,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(2019,11,20,5);
}

计算两个任意时间中间相隔的天数(计算任意两个日期的相隔天数使用场景较多,如查询某个时间段注册的新用户等等)

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(2019,07,10);
    calendar2.set(2019,11,05);
    int days=getDaysBetween(calendar1, calendar2);
    System.out.println("相隔"+days+"天");
}


最后

  • 更多参考精彩博文请看这里:《陈永佳的博客》

  • 喜欢博主的小伙伴可以加个关注、点个赞哦,持续更新嘿嘿!


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/97664.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!