Calendar详解

定义

Calendar 类是一个抽象类(Abstract Class),GregorianCalendar 是它的一个具体实现。,它为特定时间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。

常用API

这里写图片描述

设置指定的一个时间

void set(int year,int month,int date);
void set(int year,int month,int date,int hour,int minute);
void set(int year,int month,int date,int hour,int minute,int second);

测试:

@Test
public void setTest(){
    Calendar calendar = Calendar.getInstance();     
    calendar.clear();     
    calendar.set(Calendar.YEAR,2017);     
    calendar.set(Calendar.MONTH,1);//注意,Calendar对象默认一月为0  
    calendar.set(Calendar.DATE, 20);
    calendar.set(Calendar.HOUR, 16);
    calendar.set(Calendar.MINUTE, 30);
    calendar.set(Calendar.SECOND, 20);

    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    
    Date date = calendar.getTime();    
    System.out.println(df.format(date));  //2017-02-20 16:30:20
}

得到年月日、时分秒、星期等信息

主要API:

int get(int field);

其中,参数 field 的值由 Calendar 类的静态常量决定。其中:YEAR 代表年,MONTH 代表月,HOUR 代表小时,MINUTE 代表分,如:

calendar.get(Calendar.MONTH); //返回值为 0 代表当前日历是一月份,如果返回 1 代表二月份,依此类推
 get(Calendar.DAY_OF_MONTH) ; //获得这个月的第几天    
 get(Calendar.DAY_OF_WEEK); //获得这个星期的第几天    
 get(Calendar.DAY_OF_YEAR); //获得这个年的第几天    
 getTimeMillis(); //获得当前时间的毫秒表示

测试:

@Test
public void getTest(){
     Calendar cal = Calendar.getInstance();
     //当前时间:2017-2-20 16:38:54.146
     System.out.println(cal.get(Calendar.DATE));   //今天是20号
     System.out.println(cal.get(Calendar.DAY_OF_MONTH));   //今天是当前月的第20天 
     System.out.println(cal.get(Calendar.DAY_OF_WEEK));   //今天是当前周的第2天 (从星期天开始计算,如果今天星期一,那么返回2)  
     System.out.println(cal.get(Calendar.DAY_OF_YEAR));   //今天是一年的第51天
     System.out.println(cal.get(Calendar.HOUR));   //现在是4点(12小时制)
     System.out.println(cal.get(Calendar.HOUR_OF_DAY));   //现在是几点     24小时制,一般使用这个属性赋值  输出16
     System.out.println(cal.get(Calendar.MILLISECOND));   //现在是146毫秒
     System.out.println(cal.get(Calendar.MINUTE));   //现在是38分
     System.out.println(cal.get(Calendar.SECOND));   //现在是54秒
     System.out.println(cal.get(Calendar.WEEK_OF_MONTH));   //现在是一个月中的第4周
     System.out.println(cal.get(Calendar.WEEK_OF_YEAR));   //现在是一个年中的第8周
     System.out.println(cal.get(Calendar.MONTH)+1);   //现在是2月份(获取需要 +1,赋值时需要 -1)
}

Calendar与Date

Calendar转为Date

@Test
public void Cal2Date(){  
     Calendar cal=Calendar.getInstance();    
     Date date=cal.getTime();
     System.out.println(date); //Mon Feb 20 15:55:08 CST 2017
}

Date转为Calendar

@Test
public void Date2Cal(){
    Date date = new Date();    
    Calendar cal = Calendar.getInstance();    
    cal.setTime(date); 
    System.out.println(cal.getTimeInMillis());  //1487581029733
}

计算两个时间之间相隔天数

两个日历Calendar
@Test
public void diff2Canlendar(){
    Calendar calendar1 = Calendar.getInstance();
    calendar1.set(Calendar.DATE,1); //设置时间为2017-2-1...
    Calendar calendar2 = Calendar.getInstance(); //当前时间为2017-2-20

    //确保calendar1在calendar2之前    
    if(calendar1.after(calendar2)){    
        Calendar cal= calendar1;    
        calendar1 = calendar2;    
        calendar2 = cal;    
    }    
     //分别得到两个时间的毫秒数    
    long calendar1Mill = calendar1.getTimeInMillis();    
    long calendar2Mill = calendar2.getTimeInMillis();    

    long millSecond= calendar2Mill-calendar1Mill;        
    //根据毫秒数计算间隔天数    
    System.out.println( (int)(millSecond/(1000*60*60*24)));  //结果为19  
}
两个时间Date
@Test
public void diff2Date(){  
    Date date1 = new Date(1487000000000L);
    Date date2 = new Date(); //1487582726736

    if(date1.after(date2)){
        Date date = date1;
        date1 = date2;
        date2 = date;
    }
    long date1Mill = date1.getTime();
    long date2Mill = date2.getTime();
    long millSecond = date2Mill - date1Mill;
    System.out.println((int)(millSecond/(1000*60*60*24))); //6
}

GregorianCalendar 类

定义

GregorianCalendar 是一个具体实现 Calendar 类的类,该类实现了公历日历。

@Test
public void calendarSuperClass(){
    Calendar calendar = Calendar.getInstance();  
    if (calendar instanceof GregorianCalendar){  //true
        System.out.println("It is an instance of GregorianCalendar"); 
    }  
}

Calendar 类的 getInstance() 方法返回一个 GregorianCalendar,它被初始化为默认的地域和时区下的当前日期和时间。
GregorianCalendar 类定义了两个字段:AD 和 BC,分别代表公元前和公元后。其默认的构造方法 GregorianCalendar() 以默认的地域和时区的当前日期和时间初始化对象,另外也可以指定地域和时区来建立一个 GregorianCalendar 对象,如:

GregorianCalendar(Locale locale);
GregorianCalendar(TimeZone timeZone);
GregorianCalendar(TimeZone timeZone,Locale locale);

附加API

GregorianCalendar 类提供了 Calendar 类中所有的抽象方法的实现,同时还提供了一些附加的方法,其中用来判断闰年的方法为:

Boolean isLeapYear(int year);

CalendarUtil.java

import java.util.Calendar;
public class CalendarUtil {
    /**
     * 计算指定日期为当年第几周
     * @param year      指定的年份
     * @param month     指定的月份
     * @param day       指定的日
     * @return          指定日期为当年的第几周
     */
    public static int caculateWeekOfYear(int year,int month,int day){
        Calendar c = Calendar.getInstance();
        c.set(Calendar.YEAR, year);
        c.set(Calendar.MONTH, month - 1);
        c.set(Calendar.DATE, day);
        return c.get(Calendar.WEEK_OF_YEAR);
    }


    /**
     * 获取本月第一天是星期几
     * @return
     */
    public static int getWeekOfFirstDay(Calendar c){
        Calendar calendar = c;
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        return calendar.get(Calendar.DAY_OF_WEEK);
    }


    /**
     * 获取本月1号是该年的第几周
     * @return
     */
    public static int getMonthStartWeek(Calendar c){
        Calendar calendar = c;
        calendar.set(Calendar.DATE, 1);
        return calendar.get(Calendar.WEEK_OF_YEAR);
    }

    /**
     * 获取当天是该年的第几周
     */
    public static int getCurrentWeekOfYear(){
        Calendar calendar = Calendar.getInstance();
        return calendar.get(Calendar.WEEK_OF_YEAR);
    }

    /**
     * 获取上月的总天数
     * @return
     */
    public static int getLastMonthDays(Calendar c){
        Calendar calendar = c;
        calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - 1);
        return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
    }

    /**
     * 获取指定月份的总天数
     * @return
     */
    public static int getCurrentMonthDays(int month){
        Calendar c = Calendar.getInstance();
        c.set(Calendar.MONTH, month);
        return c.getActualMaximum(Calendar.DAY_OF_MONTH);
    }

    /**
     * 获取指定年份有多少周
     * @param year
     * @return
     */
    public static int getTotalWeekOfYear(int year){
        Calendar c = Calendar.getInstance();
        return c.getActualMaximum(Calendar.WEEK_OF_YEAR);
    }

    /**
     * 判断指定月份是否是当前月
     * @param month
     * @return
     */
    public static boolean isCurrentMonth(int month){
        Calendar c = Calendar.getInstance();
        return (c.get(Calendar.MONTH) == month)?true:false;
    }

    /**
     * 计算指定的月份共有多少天
     */
    public static int getTotalDaysOfMonth(int year, int month){
        Calendar c = Calendar.getInstance();
        c.set(Calendar.YEAR, year);
        c.set(Calendar.MONTH, month);
        c.set(Calendar.DATE, 1);
        return c.getActualMaximum(Calendar.DAY_OF_MONTH);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值