日期工具类-DateTime

张军 206 0

所有工具类

字符串转日期,日期转字符串,当前日期的月份,当前日期的年份,当前日期月份枚举信息,一天的开始和结束时间,获取一天,两天,三天以后的日期,获取上周 ,下周,上个月,下个月的日期,毫秒数时间戳,精确到秒,分,时,基于生日获取年龄,基于年份获取是否闰年等等。。。。

package zj.date.bean;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
/**
 * 
 * 日期工具类
 * 
 * @version 1.00 (2014.09.15)
 * @author SHNKCS 张军 {@link  <a target=_blank href="http://www.zhangjunbk.com">张军个人网站</a>&nbsp;&nbsp;&nbsp;&nbsp;<a target=_blank href="http://user.qzone.qq.com/360901061/">张军QQ空间</a>}
 * 
 */
public class DateTime extends Date {
	private static final long serialVersionUID = 1l;
	public DateTime() {
		this((Date) null);
	}

	public DateTime(Date date) {
		this(date, 13);
	}

	public DateTime(String dateString) {
		this(dateString, 13);
	}

	public DateTime(String dateString, int type) {
		this.type = 0;
		empty = true;
		setTime(dateString, type);
	}

	private void setTime(String dateTimeString, int type) {
		if (dateTimeString == null || dateTimeString.trim().length() == 0) {
			empty = true;
			return;
		}
		try {
			dateTimeString = correct(dateTimeString);
			SimpleDateFormat dateFormat = getDateFormat(type);
			Date date = dateFormat.parse(dateTimeString);
			setTime(date.getTime());
			empty = false;
		} catch (ParseException e) {
			empty = true;
			throw new IllegalArgumentException("unable to parse " + dateTimeString);
		}
		this.type = type;
		check(this, type);
	}

	private void setTime(Date date, int type) {
		if (date == null) {
			empty = true;
			return;
		} else {
			setTime(getDateFormat(type).format(date), type);
			return;
		}
	}

	public DateTime(Date date, int type) {
		this.type = 0;
		empty = true;
		setTime(date, type);
	}

	public DateTime(DateTime dateTime, int type) {
		this(((Date) (dateTime)), type);
	}

	public int getYear() {
		check(this, 11);
		return Integer.parseInt(getDateFormat(11).format(this));
	}

	public int getMonth() {
		check(this, 22);
		return Integer.parseInt(getDateFormat(22).format(this));
	}

	public int getDay() {
		check(this, 33);
		return Integer.parseInt(getDateFormat(33).format(this));
	}

	public int getWeek() {
		Calendar aCalendar = Calendar.getInstance();
		aCalendar.setTime(this);
		int week= aCalendar.get(Calendar.DAY_OF_WEEK);	
		if(week==1){
			return 7;
		}else{
			return week-1;
		}
	}

	
	public int getDaysOfMonth(){
		Calendar time=Calendar.getInstance(); 
		time.clear(); 
		time.set(Calendar.YEAR,this.getYear()); 
		//year年
		time.set(Calendar.MONTH,this.getMonth()-1);
		//Calendar对象默认一月为0,month月            
		int day=time.getActualMaximum(Calendar.DAY_OF_MONTH);
		return day;
	}
	
	public int getHour() {
		check(this, 44);
		return Integer.parseInt(getDateFormat(44).format(this));
	}

	public int getMinute() {
		check(this, 55);
		return Integer.parseInt(getDateFormat(55).format(this));
	}

	public int getSecond() {
		check(this, 66);
		return Integer.parseInt(getDateFormat(66).format(this));
	}

	@SuppressWarnings("unused")
	private static void setDateDelimiter(String delimiter) {
		DateTime.delimiter = delimiter;
	}

	public static String getDateDelimiter() {
		return delimiter;
	}

	private static SimpleDateFormat getDateFormat(int type) {
		String pattern = "";
		switch (type) {
		case YEAR_TO_YEAR: // '\013'
			pattern = "yyyy";
			break;

		case YEAR_TO_MONTH: // '\f'
			pattern = "yyyy" + delimiter + "MM";
			break;

		case YEAR_TO_DAY: // '\r'
			pattern = "yyyy" + delimiter + "MM" + delimiter + "dd";
			break;

		case YEAR_TO_HOUR: // '\016'
			pattern = "yyyy" + delimiter + "MM" + delimiter + "dd HH";
			break;

		case YEAR_TO_MINUTE: // '\017'
			pattern = "yyyy" + delimiter + "MM" + delimiter + "dd HH:mm";
			break;

		case YEAR_TO_SECOND: // '\020'
			pattern = "yyyy" + delimiter + "MM" + delimiter + "dd HH:mm:ss";
			break;

		case YEAR_TO_MILLISECOND: // '\021'
			pattern = "yyyy" + delimiter + "MM" + delimiter + "dd HH:mm:ss.SSS";
			break;

		case MONTH_TO_MONTH: // '\026'
			pattern = "MM";
			break;

		case MONTH_TO_DAY: // '\027'
			pattern = "MM" + delimiter + "dd";
			break;

		case MONTH_TO_HOUR: // '\030'
			pattern = "MM" + delimiter + "dd HH";
			break;

		case MONTH_TO_MINUTE: // '\031'
			pattern = "MM" + delimiter + "dd HH:mm";
			break;

		case MONTH_TO_SECOND: // '\032'
			pattern = "MM" + delimiter + "dd HH:mm:ss";
			break;

		case MONTH_TO_MILLISECOND: // '\033'
			pattern = "MM" + delimiter + "dd HH:mm:ss.SSS";
			break;

		case DAY_TO_DAY: // '!'
			pattern = "dd";
			break;

		case DAY_TO_HOUR: // '"'
			pattern = "dd HH";
			break;

		case DAY_TO_MINUTE: // '#'
			pattern = "dd HH:mm";
			break;

		case DAY_TO_SECOND: // '$'
			pattern = "dd HH:mm:ss";
			break;

		case DAY_TO_MILLISECOND: // '%'
			pattern = "dd HH:mm:ss.SSS";
			break;

		case HOUR_TO_HOUR: // ','
			pattern = "HH";
			break;

		case HOUR_TO_MINUTE: // '-'
			pattern = "HH:mm";
			break;

		case HOUR_TO_SECOND: // '.'
			pattern = "HH:mm:ss";
			break;

		case HOUR_TO_MILLISECOND: // '/'
			pattern = "HH:mm:ss.SSS";
			break;

		case MINUTE_TO_MINUTE: // '7'
			pattern = "mm";
			break;

		case MINUTE_TO_SECOND: // '8'
			pattern = "mm:ss";
			break;

		case MINUTE_TO_MILLISECOND: // '9'
			pattern = "mm:ss.SSS";
			break;

		case SECOND_TO_SECOND: // 'B'
			pattern = "ss";
			break;

		case SECOND_TO_MILLISECOND: // 'C'
			pattern = "ss.SSS";
			break;

		case MILLISECOND_TO_MILLISECOND: // 'M'
			pattern = "SSS";
			break;

		case 18: // '\022'
		case 19: // '\023'
		case 20: // '\024'
		case 21: // '\025'
		case 28: // '\034'
		case 29: // '\035'
		case 30: // '\036'
		case 31: // '\037'
		case 32: // ' '
		case 38: // '&'
		case 39: // '\''
		case 40: // '('
		case 41: // ')'
		case 42: // '*'
		case 43: // '+'
		case 48: // '0'
		case 49: // '1'
		case 50: // '2'
		case 51: // '3'
		case 52: // '4'
		case 53: // '5'
		case 54: // '6'
		case 58: // ':'
		case 59: // ';'
		case 60: // '<'
		case 61: // '='
		case 62: // '>'
		case 63: // '?'
		case 64: // '@'
		case 65: // 'A'
		case 68: // 'D'
		case 69: // 'E'
		case 70: // 'F'
		case 71: // 'G'
		case 72: // 'H'
		case 73: // 'I'
		case 74: // 'J'
		case 75: // 'K'
		case 76: // 'L'
		default:
			throw new IllegalArgumentException(type + " is not support");
		}
		SimpleDateFormat formatter = new SimpleDateFormat(pattern);
		return formatter;
	}

	public String toString() {
		if (empty) {
			return "";
		} else {
			SimpleDateFormat dateFormat = getDateFormat(type);
			return dateFormat.format(this);
		}
	}

	public String toString(int type) {
		if (empty) {
			return "";
		} else {
			check(this, type);
			SimpleDateFormat dateFormat = getDateFormat(type);
			return dateFormat.format(this);
		}
	}

	public static DateTime current() {
		SimpleDateFormat dateFormat = getDateFormat(17);
		return new DateTime(dateFormat.format(new Date()), 17);
	}

	public static int intervalYear(DateTime startDate, int startHour, DateTime endDate, int endHour) {
		if (startDate.getType() != 13)
			throw new IllegalArgumentException("startDate is not a validate DateTime which type is YEAR_TO_DAY");
		if (endDate.getType() != 13)
			throw new IllegalArgumentException("endDate is not a validate DateTime which type is YEAR_TO_DAY");
		startDate = new DateTime(startDate + " " + startHour, 14);
		endDate = new DateTime(endDate + " " + endHour, 14);
		int yearDiff = endDate.getYear() - startDate.getYear();
		if (endDate.getMonth() > startDate.getMonth())
			yearDiff++;
		else if (endDate.getMonth() < startDate.getMonth())
			yearDiff--;
		else if (endDate.getDay() > startDate.getDay())
			yearDiff++;
		else if (endDate.getDay() < startDate.getDay())
			yearDiff--;
		else if (endHour > startHour)
			yearDiff++;
		else if (endHour < startHour)
			yearDiff--;
		return yearDiff;
	}

	public static int intervalMonth(DateTime startDate, int startHour, DateTime endDate, int endHour) {
		if (startDate.getType() != 13)
			throw new IllegalArgumentException("startDate is not a validate DateTime which type is YEAR_TO_DAY");
		if (endDate.getType() != 13)
			throw new IllegalArgumentException("endDate is not a validate DateTime which type is YEAR_TO_DAY");
		startDate = new DateTime(startDate + " " + startHour, 14);
		endDate = new DateTime(endDate + " " + endHour, 14);
		int monthDiff = (endDate.getYear() - startDate.getYear()) * 12;
		if (endDate.getMonth() > startDate.getMonth()) {
			monthDiff += endDate.getMonth() - startDate.getMonth();
			if (endDate.getDay() > startDate.getDay())
				monthDiff++;
			else if (endDate.getDay() >= startDate.getDay() && endDate.getHour() > startDate.getHour())
				monthDiff++;
		} else if (endDate.getMonth() < startDate.getMonth()) {
			monthDiff += endDate.getMonth() - startDate.getMonth();
			if (endDate.getDay() <= startDate.getDay())
				if (endDate.getDay() < startDate.getDay())
					monthDiff--;
				else if (endDate.getHour() > startDate.getHour())
					monthDiff++;
				else if (endDate.getHour() < startDate.getHour())
					monthDiff--;
		} else if (endDate.getDay() > startDate.getDay())
			monthDiff++;
		else if (endDate.getDay() < startDate.getDay())
			monthDiff--;
		else if (endDate.getHour() <= startDate.getHour() && endDate.getHour() < startDate.getHour())
			monthDiff--;
		return monthDiff;
	}

	public static int intervalDay(DateTime startDate, int startHour, DateTime endDate, int endHour) {
		if (startDate.getType() != 13)
			throw new IllegalArgumentException("startDate is not a validate DateTime which type is YEAR_TO_DAY");
		if (endDate.getType() != 13)
			throw new IllegalArgumentException("endDate is not a validate DateTime which type is YEAR_TO_DAY");
		long diffTime = (endDate.getTime() + (long) endHour * 0x36ee80L)
				- (startDate.getTime() + (long) startHour * 0x36ee80L);
		int diffDay = (int) (diffTime / 0x5265c00L);
		long diffT = diffTime - (long) diffDay * 0x5265c00L;
		if (diffT > 0L)
			diffDay++;
		else if (diffT < 0L)
			diffDay--;
		return diffDay;
	}

	public DateTime addDay(int day) {
		DateTime dt = new DateTime(toString());
		dt.setTime(getTime() + (long) day * 0x5265c00L);
		return dt;
	}

	public DateTime addMonth(int iMonth) {
		DateTime dt = (DateTime) clone();
		GregorianCalendar gval = new GregorianCalendar();
		gval.setTime(dt);
		gval.add(2, iMonth);
		dt.setTime(gval.getTime().getTime());
		return dt;
	}

	public DateTime addYear(int iYear) {
		DateTime dt = (DateTime) clone();
		GregorianCalendar gval = new GregorianCalendar();
		gval.setTime(dt);
		gval.add(1, iYear);
		dt.setTime(gval.getTime().getTime());
		return dt;
	}

	public DateTime addHour(int hour) {
		DateTime dt = (DateTime) clone();
		dt.setTime(getTime() + (long) hour * 0x36ee80L);
		return dt;
	}

	public DateTime addMinute(int minute) {
		DateTime dt = (DateTime) clone();
		dt.setTime(getTime() + (long) minute * 60000L);
		return dt;
	}

	public int getType() {
		return type;
	}

	private static String correct(String dateString) {
		String resultString = dateString;
		if (dateString.indexOf("/") > -1)
			resultString = dateString.replace("/", delimiter);
		if (dateString.indexOf("-") > -1)
			resultString = dateString.replace("/", delimiter);
		return resultString;
	}

	public boolean isEmpty() {
		return empty;
	}

	private void check(DateTime dateTime, int type) {
		if (dateTime.isEmpty())
			throw new IllegalStateException("DateTime is empty.");
		int types[] = { 11, 12, 13, 14, 15, 16, 17, 22, 23, 24, 25, 26, 27, 33, 34, 35, 36, 37, 44, 45, 46, 47, 55, 56,
				57, 66, 67, 77 };
		boolean isValidType = false;
		for (int i = 0; i < types.length; i++)
			if (types[i] == type)
				isValidType = true;

		if (!isValidType)
			throw new IllegalStateException("this type is not support.");
		if (dateTime.getType() != type) {
			if (dateTime.getType() / 10 > type / 10)
				throw new IllegalStateException("this type is out of range of this datetime instance.");
			if (dateTime.getType() % 10 < type % 10)
				throw new IllegalStateException("this type is out of range of this datetime instance.");
		}
	}

	public static final int YEAR_TO_YEAR = 11;
	public static final int YEAR_TO_MONTH = 12;
	public static final int YEAR_TO_DAY = 13;
	public static final int YEAR_TO_HOUR = 14;
	public static final int YEAR_TO_MINUTE = 15;
	public static final int YEAR_TO_SECOND = 16;
	public static final int YEAR_TO_MILLISECOND = 17;
	public static final int MONTH_TO_MONTH = 22;
	public static final int MONTH_TO_DAY = 23;
	public static final int MONTH_TO_HOUR = 24;
	public static final int MONTH_TO_MINUTE = 25;
	public static final int MONTH_TO_SECOND = 26;
	public static final int MONTH_TO_MILLISECOND = 27;
	public static final int DAY_TO_DAY = 33;
	public static final int DAY_TO_HOUR = 34;
	public static final int DAY_TO_MINUTE = 35;
	public static final int DAY_TO_SECOND = 36;
	public static final int DAY_TO_MILLISECOND = 37;
	public static final int HOUR_TO_HOUR = 44;
	public static final int HOUR_TO_MINUTE = 45;
	public static final int HOUR_TO_SECOND = 46;
	public static final int HOUR_TO_MILLISECOND = 47;
	public static final int MINUTE_TO_MINUTE = 55;
	public static final int MINUTE_TO_SECOND = 56;
	public static final int MINUTE_TO_MILLISECOND = 57;
	public static final int SECOND_TO_SECOND = 66;
	public static final int SECOND_TO_MILLISECOND = 67;
	public static final int MILLISECOND_TO_MILLISECOND = 77;
	private static String delimiter = "-";
	private int type;
	private boolean empty;

}



更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请请扫描上面二维码支持博主1元、2元、5元等您想捐的金额吧,狠狠点击下面给点支持吧

发表我的评论
最新评论 总共0条评论