Java日期惯用操作方法工具类

Java日期常用操作方法工具类

 

package zhizhu.util;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * Java日期常用操作方法工具类
 * 
 * @author 蜘蛛
 * @date	2011-07-31
 */
public class JavaDateUtil {

	/**
	 * 判断当前时期是否为当月的月末
	 * 
	 * @param c
	 * 
	 * @return	如果给定日期为当月最后一天该方法返回true,否则返回false
	 */
	public static boolean isTodayMonthEnd(Calendar c) {
		boolean result = false;
		if(null != c && c.getActualMaximum(Calendar.DAY_OF_MONTH) == c.get(Calendar.DAY_OF_MONTH)){
			result = true;
		}
		return result;
	}
	
	/**
	 * 判断当前时期是否为当月的月初
	 * 
	 * @param c
	 * 
	 * @return	如果为每月1号,则返回true,否则返回false
	 */
	public static boolean isTodayMonthStart(Calendar c) {
		boolean result = false;
		if(null == c) c = Calendar.getInstance();
		if(1 == c.get(Calendar.DAY_OF_MONTH)){
			result = true;
		}
		return result;
	}
	
	/**
	 * 判断当前时期是否为周末
	 * 
	 * @param c
	 * 
	 * @return	给定日期为周末则返回true,否则返回false
	 */
	public static boolean isTodayWeekEnd(Calendar c) {
		boolean result = false;
		//注意在java中,周末为一周的第一天
		if(null != c && 1 == c.get(Calendar.DAY_OF_WEEK)){
			result = true;
		}
		return result;
	}
	
	/**
	 * 获取指定时间所在星期的第一天,即周一
	 * 
	 * @param calendar
	 * 
	 * @return
	 */
	public static Calendar theFirstDayOfWeek(Calendar calendar) {
		Calendar monday = null;
		if (null != calendar) {
			monday = calendar;
			//周日才是一个星期的第一天,所以周一为2,应该减去一天
			int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK)-1;
			//周日为星期一,上面减去了1,所以当等于0时,应该是周日7
			if(0 == dayOfWeek)dayOfWeek = 7;
			monday.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - (dayOfWeek-1));
		}
		return monday;
	}
	
	/**
	 * 获取指定时间所在星期的最后一天,即周日
	 * 
	 * @param calendar
	 * 
	 * @return
	 */
	public static Calendar theLastDayOfWeek(Calendar calendar) {
		Calendar sunday = null;
		if (null != calendar) {
			sunday = calendar;
			//周日才是一个星期的第一天,所以周一为2,应该减去一天
			int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK)-1;
			//周日为星期一,上面减去了1,所以当等于0时,应该是周日7
			if(0 == dayOfWeek)dayOfWeek = 7;
			sunday.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) + (7 - dayOfWeek));
		}
		return sunday;
	}
	
	/**
	 * 获取指定时间所在月份的第一天,即月初
	 * 
	 * @param calendar
	 * 
	 * @return
	 */
	public static Calendar theFirstDayOfMonth(Calendar calendar) {
		Calendar monthFirstDay = null;
		if (null != calendar) {
			monthFirstDay = calendar;
			int dayOfMonth =  calendar.get(Calendar.DAY_OF_MONTH);
			monthFirstDay.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - (dayOfMonth-1));
		}
		 return monthFirstDay;
	}
	
	/**
	 * 获取指定时间所在月份的最后一天,即月末
	 * 
	 * @param calendar
	 * 
	 * @return
	 */
	public static Calendar theLastDayOfMonth(Calendar calendar) {
		Calendar monthLastDay = null;
		if (null != calendar) {
			monthLastDay = calendar;
			int dayOfMonth =  calendar.get(Calendar.DAY_OF_MONTH);
			int maxDayOfMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
			monthLastDay.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) + (maxDayOfMonth-dayOfMonth));
		}
		 return monthLastDay;
	}
	
	/**
	 * 在指定时间上加上或减去指定天
	 * 
	 * @param calendar
	 * @param day	将要加上或减去的天数(负值代表减去)
	 * 
	 * @return
	 */
	public static Calendar AddOrMinusNDay(Calendar calendar, int day) {
		Calendar result = null;
		if (null != calendar) {
			result = calendar;
			result.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR)+day);
		}
		return result;
	}
	
	/**
	 * 在指定时间上加上或减去指定月(由于月份有大,有小,2月存在平年和闰年之别,所有下面这种方法不是
	 * 很准确,可以参照下面的方法beforeNMonth)
	 * 
	 * @param calendar
	 * @param month	将要加上或减去的月数(负值代表减去)
	 * 
	 * @return
	 */
	public static Calendar AddOrMinusNMonth(Calendar calendar, int month) {
		Calendar result = null;
		if (null != calendar) {
			result = calendar;
			result.set(Calendar.MONTH,  calendar.get(Calendar.MONTH)+month);
		}
		return result;
	}
	
	/**
	 * 在指定时间上加上或减去指定年
	 * 
	 * @param calendar
	 * @param month	将要加上或减去的年数(负值代表减去)
	 * 
	 * @return
	 */
	public static Calendar AddOrMinusNYear(Calendar calendar, int year) {
		Calendar result = null;
		if (null != calendar) {
			result = calendar;
			result.set(Calendar.YEAR,  calendar.get(Calendar.YEAR)+year);
		}
		return result;
	}
	
	/**
	 * 得到指定日期前n个月的日期,如果起始日期的日部分在回退后的月份中不存在的继续回退到当月的最大值(比如现在是5月31日,回退3个月则到2月,
	 * 而2月只有28或29天,这是就取该月的天中的最大值)
	 * 
	 * @param c	开始推算的起始日期(不指定则为当前时间)
	 * @param month	回退月数
	 * @return	
	 */
	public static Calendar beforeNMonth(Calendar c, int n){
		int month = 0;
		int year = 0;
		int day = 0;
		int maxDay = 0;
		
		Calendar calendar = null;
		if(c != null){
			calendar = c;
		}else{
			calendar = Calendar.getInstance();
		}
		//到当前指定日期为止的总月数
		month = calendar.get(Calendar.YEAR)*12+calendar.get(Calendar.MONTH)+1-n;
		//计算出年份
		year = month/12;
		//计算出月份(由于月份是从0开始的,即1月份,在Calendar中为0月份,所以要减1)
		month = month%12-1;
		//计算月份中的日
		day = calendar.get(Calendar.DAY_OF_MONTH);
		calendar.set(year, month, 1);
		//获取指定年月中的最大天数
		maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
		if (day > maxDay){
			day = maxDay;
		}
		calendar.set(Calendar.DAY_OF_MONTH, day);
		return calendar;
	}
	
	/**
	 * 按指定格式格式化指定日期(默认为yyyy-MM-dd HH:mm:ss)<br/>
	 * <i>格式化java.util.Date,java.sql.Timestamp,如果要格式化Calendar,可以通过calendar.getTime()将</i><br/>
	 * <i>Calendar对象转换成java.util.Date再进行格式化,不过也可以采用下面专门针对Calendar类的格式化方法格式化)</i>
	 * 
	 * @param date
	 * @param formatStr
	 * 
	 * @return
	 */
	public static String formatDate(Date date, String formatStr) {
		SimpleDateFormat sdf = null;
		String result = null;
		if(null == formatStr || "".equals(formatStr))formatStr = "yyyy-MM-dd HH:mm:ss";
		if (null != date) {
			sdf = new SimpleDateFormat(formatStr);
			result = sdf.format(date);
			sdf = null;
		}
		return result;
	}
	
	/**
	 * 按指定格式格式化指定日期(默认为yyyy-MM-dd HH:mm:ss)
	 * 
	 * @param date
	 * @param formatStr
	 * 
	 * @return
	 */
	public static String formatDate(Calendar calendar, String formatStr) {
		SimpleDateFormat sdf = null;
		String result = null;
		if(null == formatStr || "".equals(formatStr))formatStr = "yyyy-MM-dd HH:mm:ss";
		if (null != calendar) {
			sdf = new SimpleDateFormat(formatStr);
			result = sdf.format(calendar.getTime());
			sdf = null;
		}
		return result;
	}
	
	/**
	 * 得到指定或者当前时间前offset毫秒的Calendar
	 * @param c
	 * @param offset
	 * @return
	 */
	public static Calendar before(Calendar c, long offset){
		Calendar calendar = null;
		if(c != null){
			calendar = c;
		}else{
			calendar = Calendar.getInstance();
		}
		
		calendar.setTimeInMillis(calendar.getTimeInMillis() - offset);
		return calendar;
	}
	
	/**
	 * 得到指定或者当前时间前offset毫秒的Calendar
	 * @param c
	 * @param offset
	 * @return
	 */
	public static Calendar after(Calendar c, long offset){
		Calendar calendar = null;
		if(c != null){
			calendar = c;
		}else{
			calendar = Calendar.getInstance();
		}
		
		calendar.setTimeInMillis(calendar.getTimeInMillis() - offset);
		return calendar;
	}
	
	/**
	 * Date类型转换到Calendar类型
	 * @param d
	 * @return
	 */
	public static Calendar Date2Calendar(Date d){
		Calendar c = Calendar.getInstance();
		c.setTime(d);
		return c;
	}
	
	/**
	 * Calendar类型转换到Date类型
	 * @param c
	 * @return
	 */
	public static Date Calendar2Date(Calendar c){
		return c.getTime();
	}
	
	/**
	 * Date类型转换到Timestamp类型
	 * @param d
	 * @return
	 */
	public static Timestamp Date2Timestamp(Date d){
		return new Timestamp(d.getTime());
	}
	
	/**
	 * Calendar类型转换到Timestamp类型
	 * @param c
	 * @return
	 */
	public static Timestamp Calendar2Timestamp(Calendar c){
		return new Timestamp(c.getTimeInMillis());
	}
	
	/**
	 * Timestamp类型转换到Calendar类型
	 * @param ts
	 * @return
	 */
	public static Calendar Timestamp2Calendar(Timestamp ts){
		Calendar c = Calendar.getInstance();
		c.setTime(ts);
		return c;
	}
}
2011-07-31于合肥