一. Calendar 类详解
Calendar 类是一个抽象类,它为特定时间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。
瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。
1、使用Calendar类别之前,要先知道Calendar的一些方法取回的数字是对应于Calendar本身的常数,也就是说并不是取回1 这个数字,就表示今天是星期一。
a、想要取得时间,首先使用Calendar的getInstance()取得一个Calendar的实例,例如:
Calendar rightNow = Calendar.getInstance();
b、如果现在您想知道是几年,则可以使用get()方法并指定常数,例如:
System.out.println(rightNow.get(Calendar.YEAR));
c、如果是2005年,则上例会显示2005的数字,依照这个例子,假设撰写本文的时间是5月份,而现在想使用程式取得月份,则下例可能会有些困惑:
System.out.println(rightNow.get(Calendar.MONTH));
d、程式会显示4这个数字,而不是预期的5,因为传回的4并不是代表月份,而是对应于Calendar.MAY常数的值, Calendar在月份上的常数值从Calendar.JANUARY开始是0,到Calendar.DECEMBER的11,所以如果想要显示传回值的真正意涵,可以如下撰写:
String[] months = {"一月", "二月", "三月", "四月","五月", "六月", "七月", "八月","九月", "十月", "十一月", "十二月"};
Calendar rightNow = Calendar.getInstance();
System.out.println(months[rightNow.get(Calendar.MONTH)]);
// 初始值
// 代码如下,值得指出的是由于我们的时区设置是GMT+8,所以打印格林威治时间得到的是1970-01-01 //
// 08:00:00.
Calendar cal = Calendar.getInstance();//得到当前时间
cal.setTimeInMillis(0);//转换成格林威治时间
// 获取值
cal.get(Calendar.YEAR);//年
cal.get(Calendar.MONTH) + 1;//月(必须要+1)
cal.get(Calendar.DATE);//日
cal.get(Calendar.HOUR_OF_DAY);//时
cal.get(Calendar.MINUTE);//分
cal.get(Calendar.SECOND);//秒
cal.get(Calendar.DAY_OF_WEEK);//星期(Locale.ENGLISH情况下,周日是1,剩下自己推算)
// 如果拿时间不是为了计算而是展示出来,肯定用SimpleDateFormart了,模式为yyyy-MM-dd HH:mm:ss
// 设置值
cal.set(2013, 5, 4, 13, 44, 51);//年月日时分秒(月份0代表1月)
cal.set(Calendar.YEAR, 2014);//年
cal.set(Calendar.MONTH, 7);//月(月份0代表1月)
cal.set(Calendar.DATE, 11);//日
cal.set(Calendar.HOUR_OF_DAY, 15);//时
cal.set(Calendar.MINUTE, 33);//分
cal.set(Calendar.SECOND, 32);//秒
// 运算值
cal.add(Calendar.YEAR, 1);//年
cal.add(Calendar.MONTH, 1);//月
cal.add(Calendar.DATE, 1);//日
cal.add(Calendar.HOUR_OF_DAY, -1);//时
cal.add(Calendar.MINUTE, 1);//分
cal.add(Calendar.SECOND, 1);//秒
cal.add(Calendar.DATE, 7);//周
二. 具体实例
package hk.com.cre.process.test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import org.springframework.util.StringUtils;
/**
* 日期处理工具类
* @author ouyangjun
*/
public class SomeDateUtils {
// 日期处理格式
public static String DATE_PATTERN_YYYYMMDD = "yyyy-MM-dd";
/**
* 把日期转成字符串格式
* @param date
* @return
*/
public static String formatDateYYYYMMDD(Date date) {
SimpleDateFormat timeFt = new SimpleDateFormat(DATE_PATTERN_YYYYMMDD);
String timeStr = (date == null ? "" : timeFt.format(date));
return timeStr;
}
/**
* 某年第一天
* @param year
* @return
*/
public static String getFirstDayOfYear(int year) {
return getFirstDayOfQuarter(year, 1);
}
/**
* 某年最后一天
* @param year
* @return
*/
public static String getLastDayOfYear(int year) {
return getLastDayOfQuarter(year, 4);
}
/**
* 某年某季度第一天
* @param year
* @param quarter
* @return
*/
public static String getFirstDayOfQuarter(int year, int quarter) {
int month = 0;
if (quarter > 4) {
return null;
} else {
month = (quarter - 1) * 3 + 1;
}
return getFirstDayOfMonth(year, month);
}
/**
* 某年某季度最后一天
* @param year
* @param quarter
* @return
*/
public static String getLastDayOfQuarter(int year, int quarter) {
int month = 0;
if (quarter > 4) {
return null;
} else {
month = quarter * 3;
}
return getLastDayOfMonth(year, month);
}
/**
* 某年某月的第一天
* @param year
* @param month
* @return
*/
public static String getFirstDayOfMonth(int year, int month) {
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month-1);
c.set(Calendar.DAY_OF_MONTH, c.getActualMinimum(Calendar.DAY_OF_MONTH));
return formatDateYYYYMMDD(c.getTime());
}
/**
* 某年某月的最后一天
* @param year
* @param month
* @return
*/
public static String getLastDayOfMonth(int year, int month) {
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month-1);
c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));
return formatDateYYYYMMDD(c.getTime());
}
/**
* 某一年周的总数
* @param startDate: yyyy-MM-dd
* @param endDate: yyyy-MM-dd
* @return
*/
public static int getMaxWeekNumOfYear(String startDate, String endDate) {
if(!StringUtils.isEmpty(startDate) && !StringUtils.isEmpty(endDate)) {
SimpleDateFormat timeFt = new SimpleDateFormat(DATE_PATTERN_YYYYMMDD);
try {
Date start = timeFt.parse(startDate);
Date end = timeFt.parse(endDate);
Calendar cal=Calendar.getInstance();
cal.setTime(start);
long time1=cal.getTimeInMillis();
cal.setTime(end);
long time2=cal.getTimeInMillis();
long between_days=(time2-time1)/(1000*3600*24);
Double days=Double.parseDouble(String.valueOf(between_days));
if((days/7)>0 && (days/7)<=1){
//不满一周的按一周算
return 1;
} else if(days/7>1){
int day=days.intValue();
if(day%7>0){
return day/7+1;
}else{
return day/7;
}
}else if((days/7)==0){
return 0;
}else{
//负数返还null
return 0;
}
} catch (ParseException e) {
e.printStackTrace();
}
}
return 0;
}
/**
* 某年某周的第一天
* @param year
* @param week
* @return
*/
public static String getFirstDayOfWeek(int year, int week) {
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, year);
c.set(Calendar.WEEK_OF_YEAR, week);
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);//设置周一
c.setFirstDayOfWeek(Calendar.MONDAY);
return formatDateYYYYMMDD(c.getTime());
}
/**
* 某年某周的最后一天
* @param year
* @param week
* @return
*/
public static String getLastDayOfWeek(int year, int week) {
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, year);
c.set(Calendar.WEEK_OF_YEAR, week);
c.setFirstDayOfWeek(Calendar.MONDAY);
c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek() + 6); // Sunday
return formatDateYYYYMMDD(c.getTime());
}
/**
* 当前日期是几年第几周
* @return
*/
public static int getCurrentWeek() {
Calendar cal = Calendar.getInstance();
cal.setFirstDayOfWeek(Calendar.MONDAY);//设置周一为一周的第一天
cal.setTime(new Date());
return cal.get(Calendar.WEEK_OF_YEAR);
}
}