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