package com.yaojack.core.utils.transformat;
import java.util.Calendar;
import java.util.Date;
/**
* Calendar相关操作
* 注:请用该类中getCalendarNow方法获取系统当前时间
*
* @module 格式化
* @author YuJJ
*/
public class FormatCalendar {
/**
* 获取系统当前日期时间
*
* @return Calendar
* @author YuJJ
*/
public static Calendar getCalendarNow() {
return Calendar.getInstance();
}
/**
* Date转Calendar
*
* @param date
* 指定日期
* @return Calendar
* @author YuJJ
*/
public static Calendar getCalendar(Date date) {
if (date == null) {
return null;
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar;
}
/**
* 计算结束时间减去开始时间的差值
*
* @param start
* 开始时间
* @param end
* 结束时间
* @param type
* 1:返回毫秒数,2:返回秒数,3:返回分钟数,4:返回小时数,5:返回天数
* @return Long
* @author YuJJ
*/
public static Long getMillisDif(Date start, Date end, int type) {
if (start == null || end == null) {
return null;
}
// Long dif = end.getTime() - start.getTime();
Long dif = end.getTime() / 1000 - start.getTime() / 1000;
dif = dif * 1000;
switch (type) {
case 1:
return dif;
case 2:
return dif / 1000;
case 3:
return dif / 60000;
case 4:
return dif / 3600000;
case 5:
return dif / (24 * 3600000);
default:
return null;
}
}
/**
* 根据cycleType和dateType获取该周期单位上的开始或结束时间
*
* @param date
* @param cycleType
* 1:年,2:月,3:日,4:周,5:季,6:小时
* @param dateType
* 1:开始时间,2:结束时间
* @return Date 例如:2014-04-01 00:00:00 或者 2014-04-30 23:59:59
* @author YuJJ
*/
public static Date getTimeByCycle(Date date, int cycleType, int dateType) {
if (date == null) {
return null;
}
Calendar calendar = getCalendar(date);
int year = calendar.get(Calendar.YEAR), month;
switch (cycleType) {
case 1:
if (dateType == 1) {
calendar.set(year, 0, 1, 0, 0, 0);
} else if (dateType == 2) {
calendar.set(year + 1, 0, 1, 0, 0, -1);
} else {
return null;
}
break;
case 2:
month = calendar.get(Calendar.MONTH);
if (dateType == 1) {
calendar.set(year, month, 1, 0, 0, 0);
} else if (dateType == 2) {
calendar.set(year, month + 1, 1, 0, 0, -1);
} else {
return null;
}
break;
case 3:
month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
if (dateType == 1) {
calendar.set(year, month, day, 0, 0, 0);
} else if (dateType == 2) {
calendar.set(year, month, day + 1, 0, 0, -1);
} else {
return null;
}
break;
case 4:
int week = calendar.get(Calendar.DAY_OF_WEEK);
if (dateType == 1) {
calendar.add(Calendar.DATE, -((week + 5) % 7));
return getTimeByCycle(calendar.getTime(), 3, 1);
} else if (dateType == 2) {
// calendar.add(Calendar.DATE, 6 - ((week + 5) % 7));
calendar.add(Calendar.DATE, (8 - week) % 7);
return getTimeByCycle(calendar.getTime(), 3, 2);
} else {
return null;
}
case 5:
month = calendar.get(Calendar.MONTH);
// calendar.set(Calendar.DATE, 1);
if (dateType == 1) {
calendar.add(Calendar.MONTH, -(month % 3));
// calendar.set(Calendar.MONTH, (month / 3) * 3);
return getTimeByCycle(calendar.getTime(), 2, 1);
} else if (dateType == 2) {
calendar.add(Calendar.MONTH, 3 - (month % 3));
// calendar.set(Calendar.MONTH, (month / 3) * 3 + 2);
return getTimeByCycle(calendar.getTime(), 2, 2);
} else {
return null;
}
case 6:
month = calendar.get(Calendar.MONTH);
int day_ = calendar.get(Calendar.DAY_OF_MONTH);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
if (dateType == 1) {
calendar.set(year, month, day_, hour, 0, 0);
} else if (dateType == 2) {
calendar.set(year, month, day_, hour + 1, 0, -1);
} else {
return null;
}
break;
default:
return null;
}
return calendar.getTime();
}
/**
* 计算个数
*
* @param date
* 指定的日期
* @param type
* 11:date所在年的总天数, 12:date所有在月的总天数, 21:date的月份数-1,
* 22:date的日期天数-1。
* @return Integer
* @author YuJJ
*/
public static Integer getDayCount(Date date, int type) {
if (date == null) {
return null;
}
Calendar calendar = getCalendar(date);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
switch (type) {
case 11:
calendar.set(year + 1, 0, 0, 0, 0, 0);
return calendar.get(Calendar.DAY_OF_YEAR);
case 12:
calendar.set(year, month + 1, 0, 0, 0, 0);
return calendar.get(Calendar.DAY_OF_MONTH);
case 21:
return month - 1;
case 22:
return day - 1;
}
return null;
}
/**
* 根据参数条件改变时间
*
* @param date
* 初始时间
* @param cycleType
* 改变周期,1:秒,2:分,3:时,4:日,5:月,6:年
* @param value
* 改变量,负数:向过去偏移,正数:向未来偏移
* @return Date
* @author YuJJ
*/
public static Date offsetTime(Date date, int cycleType, int value) {
if (date == null) {
return null;
}
Calendar calendar = getCalendar(date);
int field;
switch (cycleType) {
case 1:
field = Calendar.SECOND;
break;
case 2:
field = Calendar.MINUTE;
break;
case 3:
field = Calendar.HOUR_OF_DAY;
break;
case 4:
field = Calendar.DAY_OF_MONTH;
break;
case 5:
field = Calendar.MONTH;
break;
case 6:
field = Calendar.YEAR;
break;
default:
return null;
}
calendar.add(field, value);
return calendar.getTime();
}
/**
* 获取毫秒数
*
* @param date
* 指定时间
* @param type
* 1:获取参数时间到当月第一天零点的毫秒数,2:获取参数时间月份,整月的毫秒数,3:获取参数时间到当年第一天零点的毫秒数,4:
* 获取参数时间年份,整年的毫秒数
* @return Long
* @author YuJJ
*/
public static Long getMillis(Date date, int type) {
if (date == null) {
return null;
}
Date start = null, end = null;
switch (type) {
case 1:
start = getTimeByCycle(date, 2, 1);
end = date;
break;
case 2:
start = getTimeByCycle(date, 2, 1);
end = getTimeByCycle(date, 2, 2);
break;
case 3:
start = getTimeByCycle(date, 1, 1);
end = date;
break;
case 4:
start = getTimeByCycle(date, 1, 1);
end = getTimeByCycle(date, 1, 2);
break;
default:
return null;
}
return getMillisDif(start, end, 1);
}
/**
* 判断日期
*
* @param date
* 指定时间
* @param type
* 1:是当月第一天返回true,否则返回false;2:是当月最后一天返回true,否则返回false;
* @return Boolean
* @author YuJJ
*/
public Boolean isDay(Date date, int type) {
if (date == null) {
return null;
}
Calendar cal = getCalendar(date);
switch (type) {
case 1:
int day = cal.get(Calendar.DAY_OF_MONTH);
return day == 1 ? true : false;
case 2:
int month = cal.get(Calendar.MONTH);
cal.add(Calendar.DAY_OF_MONTH, -1);
int month_next = cal.get(Calendar.MONTH);
return month == month_next ? false : true;
default:
return null;
}
}
}