package cn.com.goldenwater.dcproj.utils;
import java.lang.management.ManagementFactory;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* @author ben.chen
* @version 创建时间:2012-8-21
* 时间处理
*/
public class DateUtils {
public static Date getAddDay(Date stTm, int size) {
Calendar c = Calendar.getInstance();
c.setTime(stTm);
c.add(Calendar.DAY_OF_MONTH, size);
return c.getTime();
}
public static TimeZone zone = TimeZone.getTimeZone("GMT+8");
/**
* 获取服务器启动时间
*/
public static Date getServerStartDate()
{
long time = ManagementFactory.getRuntimeMXBean().getStartTime();
return new Date(time);
}
/**
* 计算两个时间差
*/
public static String getDatePoor(Date endDate, Date nowDate)
{
long nd = 1000 * 24 * 60 * 60;
long nh = 1000 * 60 * 60;
long nm = 1000 * 60;
// long ns = 1000;
// 获得两个时间的毫秒时间差异
long diff = endDate.getTime() - nowDate.getTime();
// 计算差多少天
long day = diff / nd;
// 计算差多少小时
long hour = diff % nd / nh;
// 计算差多少分钟
long min = diff % nd % nh / nm;
// 计算差多少秒//输出结果
// long sec = diff % nd % nh % nm / ns;
return day + "天" + hour + "小时" + min + "分钟";
}
/**
* change the number to Calendar
*
* @param numDate YYYYMMDD
* @return Calendar
*/
public static Calendar toCalendar(int numDate) {
int n = numDate;
int day = n % 100;
n /= 100;
int month = n % 100;
n /= 100;
int year = n;
Calendar calendar = new GregorianCalendar(year, month - 1, day);
return calendar;
}
/**
* add specified months to the specified date
*
* @param numDate (YYYYMMDD) of date
* @param month number of months to be added
* @return added date(a number) or -1 whenever error
*/
public static int addMonth(int numDate, int month) {
try {
// change number to Calendar
Calendar calendar = toCalendar(numDate);
// add specified months
calendar.add(Calendar.MONTH, month);
// to check if it is a valid date
int returnY = calendar.get(Calendar.YEAR);
int returnM = calendar.get(Calendar.MONTH) + 1;
int returnD = calendar.get(Calendar.DATE);
return (returnY * 10000 + returnM * 100 + returnD);
} catch (NumberFormatException ex) {
return -1;
}
}
/**
* add specified days to the specified date
*
* @param numDate (YYYYMMDD) of date
* @param day number of days to be added
* @return added date(a number) or -1 whenever error
*/
public static int addDay(int numDate, int day) {
try {
// change number to Calendar
Calendar calendar = toCalendar(numDate);
// add specified days
calendar.add(Calendar.DATE, day);
int returnY = calendar.get(Calendar.YEAR);
int returnM = calendar.get(Calendar.MONTH) + 1;
int returnD = calendar.get(Calendar.DATE);
return (returnY * 10000 + returnM * 100 + returnD);
} catch (NumberFormatException ex) {
return -1;
}
}
/**
* subtract of two dates
*
* @param minDate (YYYYMMDD) of smaller date
* @param maxDate (YYYYMMDD) of bigger date
* @return days between the two dates(int)
* or -1 whenever error occurs
*/
public static int subDate(int minDate, int maxDate) {
// smaller date > bigger date => error
if (minDate > maxDate) {
return -1;
}
// to check if the input date is a valid date
if (!isValidDate(minDate)) {
return -1;
}
if (!isValidDate(maxDate)) {
return -1;
}
try {
// change number to Calendar
Calendar calcMin = toCalendar(minDate);
Calendar calcMax = toCalendar(maxDate);
long lngMinMilSec;
long lngMaxMilSec;
// miliseconds
lngMinMilSec = (calcMin.getTime()).getTime();
lngMaxMilSec = (calcMax.getTime()).getTime();
// substract by miliseconds
return (int) ((lngMaxMilSec - lngMinMilSec) / (1000 * 60 * 60 * 24));
} catch (NumberFormatException ex) {
return -1;
}
}
/**
* to deside if the input number is a valid date
*
* @param numDate (YYYYMMDD)
* @return true(if valid), false(if invalid)
*/
public static boolean isValidDate(int numDate) {
String strDate = Integer.toString(numDate);
if (strDate.length() != 8) {
return false;
}
int fullYear = Integer.parseInt(strDate.substring(0, 4));
int month = Integer.parseInt(strDate.substring(4, 6));
int day = Integer.parseInt(strDate.substring(6, 8));
if (isValid(fullYear, month, day) == false) {
return false;
}
return true;
}
/**
* to deside if the inputs(seperated year,month,day) is a valid date
*
* @param intYear year
* @param intMonth month (1~12)
* @param intDay day
* @return true(if valid), false(if invalid)
*/
public static boolean isValid(int intYear, int intMonth, int intDay) {
Calendar calendar = new GregorianCalendar(intYear, intMonth - 1, intDay);
if ((calendar.get(Calendar.YEAR) != intYear) ||
(calendar.get(Calendar.MONTH) != (intMonth - 1)) ||
(calendar.get(Calendar.DAY_OF_MONTH) != intDay)) {
return false;
}
return true;
}
/* ************************** 转换函数 ****************************** */
/**
* switch a String to a Calendar
*
* @param input the String to be switched
* @param pattern the specified pattern
* @return output the Calendar has been switched
*/
public static Calendar Str2Calendar(String input, String pattern) {
Calendar output = null;
if (input != null) {
try {
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
sdf.setTimeZone(DateUtils.zone);
Date date = sdf.parse(input);
output = Date2Calendar(date);
} catch (ParseException e) {
System.err.println(e);
return null;
}
return output;
} else {
return null;
}
}
/**
* 转换(yyyy-mm-dd) to Calendar
*
* @param input a String with format of yyyy-mm-dd to be switched to Date
* @return cal the Calendar has been switched
*/
public static Calendar Str2CalendarYMD(String input) {
if (input == null || "".equals(input.trim())) {
return null;
}
GregorianCalendar cal = new GregorianCalendar();
cal.set(Integer.parseInt(input.substring(0, 4)), Integer.parseInt(input
.substring(5, 7)) - 1, Integer.parseInt(input.substring(8, 10)));
return cal;
}
/**
* 转换字符串格式(yyyy-mm-dd hh) to Calendar
* 如:
* 2007-05-01 08:00
* 2007-06-01 08:00
*
* @param input a String with format of yyyy-mm-dd hh to be switched to Date
* @return cal the Calendar has been switched
*/
public static Calendar Str2CalendarYMDH(String input) {
if (input == null || "".equals(input.trim())) {
return null;
}
return Str2Calendar(input, "yyyy-MM-dd HH");
}
/**
* 转换(yyyy-mm-dd hh:mm) to Calendar
*
* @param input a String with format of yyyy-mm-dd hh:mm to be switched to Date
* @return cal the Calendar has been switched
*/
public static Calendar Str2CalendarYMDHM(String input) {
if (input == null || "".equals(input.trim())) {
return null;
}
return Str2Calendar(input, "yyyy-MM-dd HH:mm");
}
/**
* 转换(yyyy-mm-dd hh:mm:ss) to Calendar
*
* @param input a String with format of yyyy-mm-dd hh:mm:ss to be switched to Date
* @return cal the Calendar has been switched
*/
public static Calendar Str2CalendarYMDHMS(String input) {
if (input == null || "".equals(input.trim())) {
return null;
}
GregorianCalendar cal = new GregorianCalendar();
cal.set(Integer.parseInt(input.substring(0, 4)),
Integer.parseInt(input.substring(5, 7)) - 1,
Integer.parseInt(input.substring(8, 10)),
Integer.parseInt(input.substring(11, 13)),
Integer.parseInt(input.substring(14, 16)),
Integer.parseInt(input.substring(17, 19)));
return cal;
}
/**
* 转换(hh:mm) to Calendar
*
* @param input a String with format of hh:mm to be switched to Date
* @return cal the Calendar has been switched
*/
public static Calendar Str2CalendarHM(String input) {
if (input == null || "".equals(input.trim())) {
return null;
}
Calendar now = new GregorianCalendar();
GregorianCalendar cal = new GregorianCalendar();
cal.set(now.get(Calendar.YEAR),
now.get(Calendar.MONTH),
now.get(Calendar.DAY_OF_MONTH),
Integer.parseInt(input.substring(0, 2)),
Integer.parseInt(input.substring(3, 5)),
0);
return cal;
}
/**
* 转换(hh:mm:ss) to Calendar
*
* @param input a String with format of hh:mm:ss to be switched to Date
* @return cal the Calendar has been switched
*/
public static Calendar Str2CalendarHMS(String input) {
if (input == null || "".equals(input.trim())) {
return null;
}
Calendar now = new GregorianCalendar();
GregorianCalendar cal = new GregorianCalendar();
cal.set(now.get(Calendar.YEAR),
now.get(Calendar.MONTH),
now.get(Calendar.DAY_OF_MONTH),
Integer.parseInt(input.substring(0, 2)),
Integer.parseInt(input.substring(3, 5)),
Integer.parseInt(input.substring(6, 8)));
return cal;
}
/**
* 转换字符串 to a Date
*
* @param input the String to be switched
* @param pattern the specified pattern
* @return output the Date has been switched
*/
public static Date Str2Date(String input, String pattern) {
Date output = null;
if (input != null) {
try {
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
sdf.setTimeZone(DateUtils.zone);
output = sdf.parse(input);
} catch (ParseException e) {
System.err.println(e);
return null;
}
return output;
} else {
return null;
}
}
/**
* 转换字符串(yyyy-mm-dd) to a Date
*
* @param input a String with format of yyyy-mm-dd to be switched to Date
* @return output the Date has been switched
*/
public static Date Str2Date(String input) {
Date output = null;
if (input != null) {
Calendar cal = Str2CalendarYMD(input);
output = cal.getTime();
return output;
} else {
return null;
}
}
/**
* 转换字符串(yyyy-mm-dd hh:mm) to a Date
*
* @param input a String with format of yyyy-mm-dd hh:mm to be switched to Date
* @return output the Date has been switched
*/
public static Date Str2DateYMDHM(String input) {
Date output = null;
if (input != null) {
Calendar cal = Str2CalendarYMDHM(input);
output = cal.getTime();
return output;
} else {
return null;
}
}
/**
* 转换字符串(yyyy-mm-dd hh:mm:ss) to a Date
*
* @param input a String with format of yyyy-mm-dd hh:mm:ss to be switched to Date
* @return output the Date has been switched
*/
public static Date Str2DateYMDHMS(String input) {
Date output = null;
if (input != null) {
Calendar cal = Str2CalendarYMDHMS(input);
output = cal.getTime();
return output;
} else {
return null;
}
}
/**
* 转换字符串(hh:mm) to a Date
*
* @param input a String with format of hh:mm to be switched to Date
* @return output the Date has been switched
*/
public static Date Str2DateHM(String input) {
Date output = null;
if (input != null) {
Calendar cal = Str2CalendarHM(input);
output = cal.getTime();
return output;
} else {
return null;
}
}
/**
* 转换字符串(hh:mm:ss) to a Date
*
* @param input a String with format of hh:mm:ss to be switched to Date
* @return output the Date has been switched
*/
public static Date Str2DateHMS(String input) {
Date output = null;
if (input != null) {
Calendar cal = Str2CalendarHMS(input);
output = cal.getTime();
return output;
} else {
return null;
}
}
/**
* switch Date to Calendar
*
* @param date
* @return cal
*/
public static Calendar Date2Calendar(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(date.getTime());
return cal;
}
/**
* 转换日期为指定格式的字符串
*
* @param date
* @param pattern 返回格式,如:yyyy-MM-dd HH:mm:ss
* @return String
*/
public static String Date2Str(Date date, String pattern) {
if (date == null) {
return "";
}
SimpleDateFormat time = new SimpleDateFormat(pattern);
time.setTimeZone(DateUtils.zone);
return time.format(date);
}
/**
* 转换Calendar为指定格式的字符串
*
* @param cal
* @param pattern 返回格式,如:yyyy-MM-dd HH:mm:ss
* @return String
*/
public static String Calendar2Str(Calendar cal, String pattern) {
SimpleDateFormat time = new SimpleDateFormat(pattern);
time.setTimeZone(DateUtils.zone);
Date date = cal.getTime();
return time.format(date);
}
/**
* 转换时间到字符串(yyyy-MM-dd)
*
* @param date
* @return String
*/
public static String Date2Str(Date date) {
SimpleDateFormat time = new SimpleDateFormat("yyyy-MM-dd");
time.setTimeZone(DateUtils.zone);
return time.format(date);
}
/**
* 转换时间到字符串(yyyy-MM-dd HH:mm)
*
* @param date
* @return String
*/
public static String Date2StrYMDHM(Date date) {
SimpleDateFormat time = new SimpleDateFormat("yyyy-MM-dd HH:mm");
time.setTimeZone(DateUtils.zone);
return time.format(date);
}
/**
* 转换时间到字符串(yyyy-MM-dd HH:mm:ss)
*
* @param date
* @return String
*/
public static String Date2StrYMDHMS(Date date) {
SimpleDateFormat time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
time.setTimeZone(DateUtils.zone);
return time.format(date);
}
/**
* 转换时间到字符串(HH:mm)
*
* @param date
* @return String
*/
public static String Date2StrHM(Date date) {
SimpleDateFormat time = new SimpleDateFormat("HH:mm");
time.setTimeZone(DateUtils.zone);
return time.format(date);
}
/**
* 转换时间到字符串(HH:mm:ss)
*
* @param date
* @return String
*/
public static String Date2StrHMS(Date date) {
SimpleDateFormat time = new SimpleDateFormat("HH:mm:ss");
time.setTimeZone(DateUtils.zone);
return time.format(date);
}
/* ******************* 取得当前日期 ********************* */
/**
* get today (yyyy-MM-dds)
*
* @return
*/
public static String getTodayYMD() {
return getToday("yyyy-MM-dd");
}
/**
* get today (yyyy-MM-dd HH:mm)
*
* @return
*/
public static String getTodayYMDHM() {
return getToday("yyyy-MM-dd HH:mm");
}
/**
* get today (yyyy-MM-dd HH:mm:ss)
*
* @return
*/
public static String getTodayYMDHMS() {
return getToday("yyyy-MM-dd HH:mm:ss");
}
/**
* 取得当前日期按指定格式显示的字符串
*
* @param format
* @return
*/
public static String getToday(String format) {
Date date = new Date();
SimpleDateFormat sd = new SimpleDateFormat(format);
sd.setTimeZone(DateUtils.zone);
return sd.format(date);
}
/* ******************* 取得上月今天 ********************* */
/**
* get today of last month
*
* @return
*/
public static String getLastMonthDate() {
GregorianCalendar cal = new GregorianCalendar();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
if (month == 1) {
// 如果今天是1月某天,计算上月今天则为去年12月某天
year = year - 1;
month = 12;
} else {
// 如果今天不是1月某天,计算上月今天则为上月某天
month = month - 1;
}
Calendar lastMonthLastDay = getBeforeLastDay(cal);
int lastMonthDay = lastMonthLastDay.get(Calendar.DAY_OF_MONTH);
if (lastMonthDay < day) {
day = lastMonthDay;
}
Calendar lastMonthToday = new GregorianCalendar(year, month, day);
return Date2Str(lastMonthToday.getTime());
}
/* ******************* 取得指定月的上月今天 ********************* */
/**
* get the time on designated of last month
*
* @return
*/
public static String getOnDesignatedLastMonthDate(String time) {
Calendar cal = DateUtils.Str2CalendarYMDHMS(time);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
int hour = cal.get(Calendar.HOUR_OF_DAY);
int minute = cal.get(Calendar.MINUTE);
int second = cal.get(Calendar.SECOND);
if (month == 1) {
// 如果天是1月某天,计算上月今天则为去年12月某天
year = year - 1;
month = 12;
} else {
// 如果天不是1月某天,计算上月今天则为上月某天
month = month - 1;
}
Calendar lastMonthLastDay = getBeforeLastDay(cal);
int lastMonthDay = lastMonthLastDay.get(Calendar.DAY_OF_MONTH);
if (lastMonthDay < day) {
day = lastMonthDay;
}
Calendar lastMonthToday = new GregorianCalendar(year, month, day, hour, minute, second);
return Date2StrYMDHMS(lastMonthToday.getTime());
}
/* ******************* 取得指定月的下月今天 ********************* */
/**
* get the time on designated of last month
*
* @return
*/
public static String getOnDesignatedNextMonthDate(String time) {
Calendar cal = DateUtils.Str2CalendarYMDHMS(time);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
int hour = cal.get(Calendar.HOUR_OF_DAY);
int minute = cal.get(Calendar.MINUTE);
int second = cal.get(Calendar.SECOND);
if (month == 12) {
// 如果天是1月某天,计算上月今天则为去年12月某天
year = year + 1;
month = 1;
} else {
// 如果天不是1月某天,计算上月今天则为上月某天
month = month + 1;
}
Calendar lastMonthLastDay = getAfterLastDay(cal);
int lastMonthDay = lastMonthLastDay.get(Calendar.DAY_OF_MONTH);
if (lastMonthDay < day) {
day = lastMonthDay;
}
Calendar lastMonthToday = new GregorianCalendar(year, month, day, hour, minute, second);
return Date2StrYMDHMS(lastMonthToday.getTime());
}
public static String getLastYearDate() {
GregorianCalendar cal = new GregorianCalendar();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
year = year - 1;
Calendar lastMonthToday = new GregorianCalendar(year, month, day);
return Date2Str(lastMonthToday.getTime());
}
/* ******************* 一些关于旬的方法 ********************* */
/**
* 判断日期是否是一旬的开始日
*
* @param cal
* @return true if 1日、11日、21日
*/
public static boolean isStartOf10Days(Calendar cal) {
boolean ret = false;
int intDay = cal.get(Calendar.DAY_OF_MONTH);
if (intDay == 1 || intDay == 11 || intDay == 21) {
ret = true;
}
return ret;
}
/**
* 判断日期是否是一旬的结束日
*
* @param cal
* @return true if 10日、20日、当月最后一天
*/
public static boolean isEndOf10Days(Calendar cal) {
boolean ret = false;
int intDay = cal.get(Calendar.DAY_OF_MONTH);
if (intDay == 10 || intDay == 20 || calEquals(cal, getLastDay(cal)) == true) {
ret = true;
}
return ret;
}
/**
* 判断两个日期的年月日部分是否相同
*
* @param first
* @param second
* @return
*/
private static boolean calEquals(Calendar first, Calendar second) {
return Date2Str(first.getTime()).equals(Date2Str(second.getTime()));
}
/**
* 判断两个日期是否在同一个旬中
* cal1、cal2都不是某旬的开始日或结束日
*
* @param cal1
* @param cal2
* @return
*/
public static boolean isInSame10Days(Calendar cal1, Calendar cal2) {
boolean ret = false;
// 取得给出日期之前出现的最后一个旬的开始日
Calendar calStart = getS10DaysBefore(cal1);
// 取得给出日期之后出现的第一个旬的结束日
Calendar calEnd = getE10DaysAfter(cal1);
if (cal2.after(calStart) == true && cal2.before(calEnd) == true) {
ret = true;
}
return ret;
}
/**
* 取得当月第一天
*
* @param cal
* @return
*/
private static Calendar getFirstDay(Calendar cal) {
Calendar ret = (Calendar) cal.clone();
ret.set(Calendar.DAY_OF_MONTH, 1);
return ret;
}
/**
* 取得当月最后一天
*
* @param cal
* @return
*/
private static Calendar getLastDay(Calendar cal) {
Calendar ret = (Calendar) cal.clone();
ret.add(Calendar.MONTH, 1);
ret.set(Calendar.DAY_OF_MONTH, 1);
ret.add(Calendar.DAY_OF_MONTH, -1);
return ret;
}
/**
* 取得次月第一天
*
* @param cal
* @return
*/
public static Calendar getNextFirstDay(Calendar cal) {
Calendar ret = getFirstDay(cal);
ret.add(Calendar.MONTH, 1);
return ret;
}
/**
* 取得次月最后一天
*
* @param cal
* @return
*/
public static Calendar getNextLastDay(Calendar cal) {
Calendar ret = (Calendar) cal.clone();
ret.add(Calendar.MONTH, 1);
ret = getLastDay(ret);
return ret;
}
/**
* 取得前月第一天
*
* @param cal
* @return
*/
public static Calendar getBeforeFirstDay(Calendar cal) {
Calendar ret = getFirstDay(cal);
ret.add(Calendar.MONTH, -1);
return ret;
}
/**
* 取得前月最后一天
*
* @param cal
* @return
*/
public static Calendar getBeforeLastDay(Calendar cal) {
Calendar ret = (Calendar) cal.clone();
ret.add(Calendar.MONTH, -1);
ret = getLastDay(ret);
return ret;
}
/**
* 取得下月最后一天
*
* @param cal
* @return
*/
public static Calendar getAfterLastDay(Calendar cal) {
Calendar ret = (Calendar) cal.clone();
ret.add(Calendar.MONTH, +1);
ret = getLastDay(ret);
return ret;
}
/**
* 取得给出日期之前出现的最后一个旬的开始日
*
* @param cal
* @return
*/
public static Calendar getS10DaysBefore(Calendar cal) {
int day = cal.get(Calendar.DAY_OF_MONTH);
Calendar ret = (Calendar) cal.clone();
if (day == 1 || day == 11 || day == 21) {
ret = getStart10DaysBefore(ret);
} else if (day > 1 && day < 11) {
ret.set(Calendar.DAY_OF_MONTH, 1);
} else if (day > 11 && day < 21) {
ret.set(Calendar.DAY_OF_MONTH, 11);
} else {
ret.set(Calendar.DAY_OF_MONTH, 21);
}
return ret;
}
/**
* 取得给出日期之后出现的第一个旬的开始日
*
* @param cal
* @return
*/
public static Calendar getS10DaysAfter(Calendar cal) {
int day = cal.get(Calendar.DAY_OF_MONTH);
Calendar ret = (Calendar) cal.clone();
if (day == 1 || day == 11 || day == 21) {
ret = getStart10DaysAfter(ret);
} else if (day > 1 && day < 11) {
ret.set(Calendar.DAY_OF_MONTH, 11);
} else if (day > 11 && day < 21) {
ret.set(Calendar.DAY_OF_MONTH, 21);
} else {
ret.set(Calendar.DAY_OF_MONTH, 21);
ret = getStart10DaysAfter(ret);
}
return ret;
}
/**
* 取得给出日期之前出现的最后一个旬的结束日
*
* @param cal
* @return
*/
public static Calendar getE10DaysBefore(Calendar cal) {
int day = cal.get(Calendar.DAY_OF_MONTH);
Calendar ret = (Calendar) cal.clone();
if (day == 1 || day == 11 || day == 21) {
ret.add(Calendar.DAY_OF_MONTH, -1);
} else if (day > 1 && day < 11) {
ret = getBeforeLastDay(ret);
} else if (day > 11 && day < 21) {
ret.set(Calendar.DAY_OF_MONTH, 10);
} else {
ret.set(Calendar.DAY_OF_MONTH, 20);
}
return ret;
}
/**
* 取得给出日期之后出现的第一个旬的结束日
*
* @param cal
* @return
*/
public static Calendar getE10DaysAfter(Calendar cal) {
int day = cal.get(Calendar.DAY_OF_MONTH);
Calendar ret = (Calendar) cal.clone();
if (day == 10 || day == 20 || day == getLastDay(ret).get(Calendar.DAY_OF_MONTH)) {
// 原值返回
} else if (day >= 1 && day < 10) {
ret.set(Calendar.DAY_OF_MONTH, 10);
} else if (day >= 11 && day < 20) {
ret.set(Calendar.DAY_OF_MONTH, 20);
} else {
ret = getLastDay(ret);
}
return ret;
}
/**
* 取得1旬之后的开始日期
*
* @param cal 旬的开始时间(1日或11日或21)
* @return
*/
public static Calendar getStart10DaysAfter(Calendar cal) {
Calendar ret = (Calendar) cal.clone();
int day = cal.get(Calendar.DAY_OF_MONTH);
if (day != 21) {
// 1日或11日,直接加10天,则为下一个旬的开始日
ret.add(Calendar.DAY_OF_MONTH, 10);
} else {
// 21日,取次月1日为下一个旬的开始日
ret = getLastDay(ret);
ret.add(Calendar.DAY_OF_MONTH, 1);
}
return ret;
}
/**
* 取得1旬之后的结束日期
*
* @param cal 旬的开始时间(1日或11日或21)
* @return
*/
public static Calendar getEnd10DaysAfter(Calendar cal) {
Calendar ret = getStart10DaysAfter(cal);
ret.add(Calendar.DAY_OF_MONTH, -1);
return ret;
}
/**
* 取得1旬之前的结束日期
*
* @param cal 旬的结束日 (10日或20日或月末)
* @return
*/
private static Calendar getEnd10DaysBefore(Calendar cal) {
Calendar ret = (Calendar) cal.clone();
int day = cal.get(Calendar.DAY_OF_MONTH);
if (day != 10) {
// 20日或月末,直接减10天,则为前一个旬的结束日
ret.add(Calendar.DAY_OF_MONTH, -10);
} else {
// 10日,取前月月末为前一个旬的结束日
ret = getFirstDay(ret);
ret.add(Calendar.DAY_OF_MONTH, -1);
}
return ret;
}
/**
* 取得1旬之前的开始日期
*
* @param cal 旬的结束日 (10日或20日或月末)
* @return
*/
private static Calendar getStart10DaysBefore(Calendar cal) {
Calendar ret = getEnd10DaysBefore(cal);
ret.add(Calendar.DAY_OF_MONTH, 1);
return ret;
}
/**
* 将String数组(特定的格式)转换为Date数组
*
* @param input
* @param format
* @return
*/
public static Date[] StrArray2DateArray(String[] input, String format) {
int size = input.length;
Date[] output = new Date[size];
if (input != null) {
for (int i = 0; i < size; i++) {
output[i] = Str2Date(input[i], format);
}
return output;
} else {
return null;
}
}
/**
* 将String数组(特定的格式)转换为Calendar数组
*
* @param input
* @param format
* @return
*/
public static Calendar[] StrArray2CalArray(String[] input, String format) {
int size = input.length;
Calendar[] output = new Calendar[size];
if (input != null) {
for (int i = 0; i < size; i++) {
output[i] = Str2Calendar(input[i], format);
}
return output;
} else {
return null;
}
}
/**
* 将Calendar数组(特定的格式)转换为String数组
*
* @param input
* @param format
* @return
*/
public static String[] CalArray2StrArray(Calendar[] input, String format) {
int size = input.length;
String[] output = new String[size];
if (input != null) {
for (int i = 0; i < size; i++) {
if (input[i] == null) {
output[i] = null;
} else {
output[i] = Calendar2Str(input[i], format);
}
}
return output;
} else {
return null;
}
}
/**
* 将Calendar 的list转换成String类型
*
* @param input
* @param format
* @return
*/
public static String calList2Str(List input, String format) {
String result = "";
for (int i = 0; i < input.size(); i++) {
result += i + " : " + DateUtils.Calendar2Str((Calendar) input.get(i), format) + "\n";
}
return result;
}
/**
* 求两个日期相差的年数
*
* @param cal1:结束时间
* @param cal2:开始时间
* @return
*/
public static int subCalendar2Year(Calendar cal1, Calendar cal2) {
long sub = cal1.getTimeInMillis() - cal2.getTimeInMillis();
return (int) Math.round((sub / (1000.0 * 60 * 60 * 24 * 30 * 12)));
}
/**
* 求两个日期相差的月数
*
* @param cal1:结束时间
* @param cal2:开始时间
* @return
*/
public static int subCalendar2Month(Calendar cal1, Calendar cal2) {
long sub = cal1.getTimeInMillis() - cal2.getTimeInMillis();
return (int) Math.round((sub / (1000.0 * 60 * 60 * 24 * 30)));
}
/**
* 求两个日期相差的日数
*
* @param cal1:结束时间
* @param cal2:开始时间
* @return
*/
public static int subCalendar2Day(Calendar cal1, Calendar cal2) {
long sub = cal1.getTimeInMillis() - cal2.getTimeInMillis();
return (int) Math.round((sub / (1000.0 * 60 * 60 * 24)));
}
/**
* 求两个日期相差的小时数
*
* @param cal1:结束时间
* @param cal2:开始时间
* @return
*/
public static int subCalendar2Hour(Calendar cal1, Calendar cal2) {
long sub = cal1.getTimeInMillis() - cal2.getTimeInMillis();
return (int) Math.round((sub / (1000.0 * 60 * 60)));
}
public static int subCalendar2Minute(Calendar cal1, Calendar cal2) {
long sub = cal1.getTimeInMillis() - cal2.getTimeInMillis();
return (int) Math.round((sub / (1000.0 * 60)));
}
public static int subCalendar2Minute(String cal1, String cal2, String pattern) {
return subCalendar2Minute(Str2Calendar(cal1, pattern), Str2Calendar(cal2, pattern));
}
/**
* 求两个日期相差的时间(cal2 - cal1)
*
* @param interval :
* yyyy 年
* q 季度
* m 月
* y 一年的日数
* d 日
* w 一周的日数
* ww 周
* h 小时
* n 分钟
* s 秒
* @param cal1
* @param cal2
* @return
*/
public static int DateDiff(String interval, Calendar cal1, Calendar cal2) {
int ret = 0;
if ("y".equals(interval) == true) {
ret = DateDiff2Year(cal1, cal2); // 年
} else if ("m".equals(interval) == true) {
ret = DateDiff2Month(cal1, cal2); // 月
} else if ("d".equals(interval) == true) {
ret = DateDiff2Day(cal1, cal2); // 日
} else if ("h".equals(interval) == true) {
ret = DateDiff2Hour(cal1, cal2); // 小时
} else if ("n".equals(interval) == true) {
ret = DateDiff2Minute(cal1, cal2); // 分钟
}
return ret;
}
/**
* 求两个日期相加的时间(cal + number)
*
* @param interval :
* yyyy 年
* q 季度
* m 月
* y 一年的日数
* d 日
* w 一周的日数
* ww 周
* h 小时
* n 分钟
* s 秒
* @param number : 正负整数
* @param cal : 操作的日期
* @return
*/
public static Calendar DateAdd(String interval, int number, Calendar cal) {
Calendar ret = (Calendar) cal.clone();
if ("yyyy".equals(interval) == true) {
ret.add(Calendar.YEAR, number); // 年
} else if ("y".equals(interval) == true) {
ret.add(Calendar.DAY_OF_YEAR, number); // 一年的日数
} else if ("m".equals(interval) == true) {
ret.add(Calendar.MONTH, number); // 月
} else if ("d".equals(interval) == true) {
ret.add(Calendar.DAY_OF_MONTH, number); // 日
} else if ("w".equals(interval) == true) {
ret.add(Calendar.DAY_OF_WEEK, number); // 一周的日数
} else if ("ww".equals(interval) == true) {
ret.add(Calendar.WEEK_OF_MONTH, number); // 周
} else if ("h".equals(interval) == true) {
ret.add(Calendar.HOUR_OF_DAY, number); // 小时
} else if ("n".equals(interval) == true) {
ret.add(Calendar.MINUTE, number); // 分钟
} else if ("s".equals(interval) == true) {
ret.add(Calendar.SECOND, number); // 秒
}
return ret;
}
public static Calendar format(Calendar cal, String pattern) {
Calendar ret = (Calendar) cal.clone();
String strCal = Calendar2Str(cal, pattern);
ret = Str2Calendar(strCal, "yyyy-MM-dd HH:mm");
return ret;
}
/**
* 求两个日期相差的年数(cal2 - cal1)
*
* @param cal1:开始时间
* @param cal2:结束时间
* @return
*/
public static int DateDiff2Year(Calendar cal1, Calendar cal2) {
long sub = cal2.getTimeInMillis() - cal1.getTimeInMillis();
return (int) Math.round((sub / (1000.0 * 60 * 60 * 24 * 30 * 12)));
}
/**
* 求两个日期相差的月数(cal2 - cal1)
*
* @param cal1:开始时间
* @param cal2:结束时间
* @return
*/
public static int DateDiff2Month(Calendar cal1, Calendar cal2) {
long sub = cal2.getTimeInMillis() - cal1.getTimeInMillis();
return (int) Math.round((sub / (1000.0 * 60 * 60 * 24 * 30)));
}
/**
* 求两个日期相差的日数(cal2 - cal1)
*
* @param cal1:开始时间
* @param cal2:结束时间
* @return
*/
public static int DateDiff2Day(Calendar cal1, Calendar cal2) {
long sub = cal2.getTimeInMillis() - cal1.getTimeInMillis();
return (int) Math.round((sub / (1000.0 * 60 * 60 * 24)));
}
/**
* 求两个日期相差的小时数(cal2 - cal1)
*
* @param cal1:开始时间
* @param cal2:结束时间
* @return
*/
public static int DateDiff2Hour(Calendar cal1, Calendar cal2) {
long sub = cal2.getTimeInMillis() - cal1.getTimeInMillis();
return (int) Math.round((sub / (1000.0 * 60 * 60)));
}
/**
* 求两个日期相差的分钟数(cal2 - cal1)
*
* @param cal1:开始时间
* @param cal2:结束时间
* @return
*/
public static int DateDiff2Minute(Calendar cal1, Calendar cal2) {
if (cal1 == null && cal2 == null) {
return 0;
}
if (cal1 == null) {
return (int) Math.round((cal2.getTimeInMillis() / (1000.0 * 60)));
}
if (cal2 == null) {
return -(int) Math.round((cal1.getTimeInMillis() / (1000.0 * 60)));
}
long sub = cal2.getTimeInMillis() - cal1.getTimeInMillis();
return (int) Math.round((sub / (1000.0 * 60)));
}
/**
* 将日期的小时设置为8点0分,其他不变
*
* @param input
* @return
*/
public static Calendar set8Hour(Calendar input) {
Calendar ret = (Calendar) input.clone();
ret.set(Calendar.HOUR_OF_DAY, 8);
ret.set(Calendar.MINUTE, 0);
ret.set(Calendar.MILLISECOND, 0);
return ret;
}
//1:当日,2:本周,3:本月,4:本年
public static Date getStartDateForQueryType(int type) {
Calendar cal = Calendar.getInstance();
if (type == 2) {
cal.set(Calendar.DAY_OF_WEEK, 1);
cal.add(Calendar.DATE, 1);
} else if (type == 3) {
cal.set(Calendar.DAY_OF_MONTH, 1);
} else if (type == 4) {
cal.set(Calendar.DAY_OF_YEAR, 1);
}
return cal.getTime();
}
public static Date getTorrow() {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, 1);
return cal.getTime();
}
public static Date getTorrow(Date date, int amount) {
Calendar cal = Date2Calendar(date);
cal.add(Calendar.DATE, amount);
return cal.getTime();
}
public static int getYear(Date date) {
Calendar cal = Date2Calendar(date);
return cal.get(Calendar.YEAR);
}
public static int getMonth(Date date) {
Calendar cal = Date2Calendar(date);
return cal.get(Calendar.MONTH) + 1;
}
public static List getLast12Month() {
List list = new ArrayList<>();
List list2 = new ArrayList<>();
Calendar cal = Calendar.getInstance();
list.add(Calendar2Str(cal, "yyyy-MM"));
for (int i = 0; i < 11; i++) {
cal.add(Calendar.MONTH, -1);
list.add(Calendar2Str(cal, "yyyy-MM"));
}
for (int i = list.size() - 1; i >= 0; i--) {
list2.add(list.get(i));
}
return list2;
}
/**
* 判断当前时间是否在[startTime, endTime]区间,注意时间格式要一致
*
* @param nowTime 当前时间
* @param startTime 开始时间
* @param endTime 结束时间
* @return
*/
public static boolean isEffectiveDate(Date nowTime, Date startTime, Date endTime) {
if (nowTime.getTime() == startTime.getTime() || nowTime.getTime() == endTime.getTime()) {
return true;
}
Calendar date = Calendar.getInstance();
date.setTime(nowTime);
Calendar begin = Calendar.getInstance();
begin.setTime(startTime);
Calendar end = Calendar.getInstance();
end.setTime(endTime);
return date.after(begin) && date.before(end);
}
}