import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;/**
* 时间处理相关辅助类<br>
*
* patternString相应的说明如下:<br>
* y:年 ; M:月 ; d:日 ; <br>
* H:时 ; m:分 ; s:秒 ; <br>
* S:毫秒 <br>
* E:星期几(这里多个E也只能显示一次(如:星期三)) <br>
*
* 多个相应的字母时,表示该值显示N位 <br>
*
*
* @since 2012-04-25
*
*
*/
public class DateRelatedUtils {
/**
* 实例化一个 Calendar 对象
*/
private static Calendar calendar = Calendar.getInstance();/**
* 将Date转换成相应的patternString格式
*
* @param basicDate
* 时间
* @param patternString
* 格式
* @return String
*
*/
public static String getFormattedDateAsString(Date basicDate,
String patternString) {SimpleDateFormat dateFormater = new SimpleDateFormat(patternString);
// 返回格式化后的时间串
return dateFormater.format(basicDate);}
/**
* 返回加addDays天后的串,addDays可以为负数<br>
* patternString:只能是年月日相应的不同格式
*
* @param basicDate
* 时间
* @param addDays
* 加的天数
* @param patternString
* @return String
*/
public static String addDaysAsString(Date basicDate, int addDays,
String patternString) {// 得到加了天数后的时间
basicDate = addDays(basicDate, addDays);// 返回相应格式的时间串
return getFormattedDateAsString(basicDate, patternString);
}/**
* 计算两个日期相隔的天数<br>
* 两个值不分前后,求绝对值
*
* @param firstDate
* @param secondDate
* @return Integer
*/
public static int getGapDays(Date firstDate, Date secondDate) {// 先拿到两个日期 年月日 后边的时分秒不管了
String patternString = "yyyy-MM-dd";
String firstDateString = getFormattedDateAsString(firstDate,
patternString);
String secondDateString = getFormattedDateAsString(secondDate,
patternString);// 转换成Date对象
firstDate = getDateByDateString(firstDateString, patternString);
secondDate = getDateByDateString(secondDateString, patternString);int nDays = (int) ((secondDate.getTime() - firstDate.getTime()) / (24 * 60 * 60 * 1000));
return Math.abs(nDays);
}/**
* 计算两个日期相隔的天数
*
* @param firstString
* 格式yyyy-MM-dd
* @param secondString
* 格式yyyy-MM-dd
* @return Integer
*/
public static int getGapDays(String firstString, String secondString) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Date firstDate = null;
Date secondDate = null;try {
firstDate = df.parse(firstString);
secondDate = df.parse(secondString);
} catch (Exception e) {
e.printStackTrace();
// 日期型字符串格式错误
throw new IllegalArgumentException("日期型字符串格式错误!");
}return getGapDays(firstDate, secondDate);
}/**
* 将指定格式的日期串转化为日期对象
*
* @param basicDate
* 时间
* @param patternString
* 输入的时间串的格式
* @return Date
* @throws Exception
*/
public static Date getDateByDateString(String basicDate,
String patternString) {SimpleDateFormat df = new SimpleDateFormat(patternString);
Date date = null;
try {
date = df.parse(basicDate);
} catch (Exception ex) {
throw new IllegalArgumentException("日期串与格式串不匹配或者格式串有误!");
}return date;
}/**
* 得到basicDate这一年的第一天
*
* @return Date
*/
public static Date getFirstDayOfYear(Date basicDate) {calendar.setTime(basicDate);
calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR));
calendar.set(Calendar.MONTH, Calendar.JANUARY);
calendar.set(Calendar.DAY_OF_MONTH, 1);return calendar.getTime();
}
/**
* 得到basicDate这一年的第一天
*
* @param basicDate
* 时间
* @param patternString
* 返回串格式
* @return String
*/
public static String getFirstDayOfYearAsString(Date basicDate,
String patternString) {// 得到这一年的第一天
basicDate = getFirstDayOfYear(basicDate);// 返回相应格式的时间串
return getFormattedDateAsString(basicDate, patternString);}
/**
* 得到basicDate这一年的最后一天
*
* @param basicDate
* 时间
* @return Date
*/
public static Date getLastDayOfYear(Date basicDate) {calendar.setTime(basicDate);
calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR));
calendar.set(Calendar.MONTH, Calendar.DECEMBER);
calendar.set(Calendar.DAY_OF_MONTH, 31);return calendar.getTime();
}
/**
* 得到basicDate这一年的最后一天
*
* @param basicDate
* 时间
* @param patternString
* 返回串格式
* @return String
*/
public static String getLastDayOfYearAsString(Date basicDate,
String patternString) {// 得到这一年的最后一天
basicDate = getLastDayOfYear(basicDate);// 返回相应的时间格式串
return getFormattedDateAsString(basicDate, patternString);}
/**
* 得到basicDate 这一月的第一天
*
* @param basicDate
* 时间
* @return Date
*/
public static Date getFirstDayOfMonth(Date basicDate) {calendar.setTime(basicDate);
calendar.add(Calendar.MONTH, 0);
calendar.set(Calendar.DAY_OF_MONTH, 1);return calendar.getTime();
}
/**
* 得到basicDate 这一月的第一天
*
* @param basicDate
* 时间
* @param patternString
* 格式
* @return String
*/
public static String getFirstDayOfMonthAsString(Date basicDate,
String patternString) {
// 得到这一月的第一天
basicDate = getFirstDayOfMonth(basicDate);
// 返回相应的时间格式串
return getFormattedDateAsString(basicDate, patternString);
}/**
* 得到basicDate 这一月的最后一天
*
* @param basicDate
* 时间
* @return Date
*/
public static Date getLastDayOfMonth(Date basicDate) {calendar.setTime(basicDate);
calendar.add(Calendar.MONTH, 1);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.add(Calendar.DAY_OF_MONTH, -1);return calendar.getTime();
}
/**
* 得到basicDate 这一月的最后一天
*
* @param basicDate
* 时间
* @param patternString
* 格式
* @return String
*/
public static String getLastDayOfMonthAsString(Date basicDate,
String patternString) {
// 得到这一月的最后一天
basicDate = getLastDayOfMonth(basicDate);
// 返回相应的时间格式串
return getFormattedDateAsString(basicDate, patternString);
}/**
* 得到basicDate的下个月初
*
* @param basicDate
* 时间
* @return Date
*/
public static Date getFirstDayOfLastMonth(Date basicDate) {calendar.setTime(basicDate);
calendar.add(Calendar.MONTH, 1);
calendar.set(Calendar.DAY_OF_MONTH, 1);return calendar.getTime();
}
/**
* 得到basicDate 下一月月初
*
* @param basicDate
* 时间
* @param patternString
* 格式
* @return String
*/
public static String getFirstDayOfLastMonthAsString(Date basicDate,
String patternString) {
// 得到下月月初
basicDate = getFirstDayOfLastMonth(basicDate);
// 返回相应的时间格式串
return getFormattedDateAsString(basicDate, patternString);
}/**
* 按中国人的习惯 得到basicDate 这周的第一天(周一)
*
* @param basicDate
* 时间
* @return Date
*/
public static Date getFirstDayOfWeekAsDateForChinese(Date basicDate) {calendar.setTime(basicDate);
if(calendar.get(Calendar.DAY_OF_WEEK) != 1) {
calendar.add(Calendar.DAY_OF_MONTH, 0);
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
} else {
calendar.setTime(addDays(basicDate, -6));
}return calendar.getTime();
}
/**
* 按中国人的习惯得到basicDate 这周的第一天(周一)
*
* @param basicDate
* 时间
* @param patternString
* 格式
* @return String
*/
public static String getFirstDayOfWeekAsStringForChinese(Date basicDate,
String patternString) {
// 得到这周第一天
basicDate = getFirstDayOfWeekAsDateForChinese(basicDate);
// 返回相应的时间格式串
return getFormattedDateAsString(basicDate, patternString);
}/**
* 按中国人的习惯得到basicDate 这周的最后一天(周日)
*
* @param basicDate
* 时间
* @return Date
*/
public static Date getLastDayOfWeekAsDateForChinese(Date basicDate) {calendar.setTime(basicDate);
if(calendar.get(Calendar.DAY_OF_WEEK) != 1) {
calendar.add(Calendar.DAY_OF_MONTH, 0);
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
calendar.add(Calendar.DAY_OF_MONTH, 6);
}return calendar.getTime();
}
/**
* 按中国人的习惯得到basicDate 这周的最后一天(周日)
*
* @param basicDate
* 时间
* @param patternString
* 格式
* @return String
*/
public static String getLastDayOfWeekAsStringForChinese(Date basicDate,
String patternString) {
// 得到这周最后一天
basicDate = getLastDayOfWeekAsDateForChinese(basicDate);
// 返回相应的时间格式串
return getFormattedDateAsString(basicDate, patternString);
}/**
* 按美国人习惯得到 basicDate 这周的第一天(周日为一周的第一天)
*
* @param basicDate
* @return
*/
public static Date getFirstDayOfWeekAsDate(Date basicDate) {
if (basicDate == null) {
return null;
} else {
calendar.setTime(basicDate);
int weekindex = calendar.get(7);
Date firstDay = addDays(basicDate, (weekindex - weekindex * 2) + 1);
return firstDay;
}
}/**
* 按美国人习惯得到 basicDate 这周的第一天(周日为一周的第一天)
*
* @param basicDate
* 时间
* @param patternString
* 格式
* @return
*/
public static String getFirstDayOfWeekAsString(Date basicDate,
String patternString) {
if (basicDate == null) {
return null;
} else {
Date firstDay = getFirstDayOfWeekAsDate(basicDate);
return getFormattedDateAsString(firstDay, patternString);
}
}/**
* 按美国人习惯得到 basicDate 这周的最后一天(周六为一周的最后一天)
*
* @param basicDate
* 时间
* @return
*/
public static Date getLastDayOfWeekAsDate(Date basicDate) {
if (basicDate == null) {
return null;
} else {
calendar.setTime(basicDate);
int weekindex = calendar.get(7);
Date lastDay = addDays(basicDate, 7 - weekindex);
return lastDay;
}
}/**
* 按美国人习惯得到 basicDate 这周的最后一天(周六为一周的最后一天)
*
* @param basicDate
* 时间
* @param patternString
* 格式
* @return
*/
public static String getLastDayOfWeekAsString(Date basicDate,
String patternString) {
if (basicDate == null) {
return null;
} else {
Date lastDay = getLastDayOfWeekAsDate(basicDate);
return getFormattedDateAsString(lastDay, patternString);
}
}/**
* 判断是否润年<br>
* <br>
* true 是闰年<br>
* false 不是闰年
*
* @param basicDate
* 时间
* @return boolean
*/
public static boolean isLeapYear(Date basicDate) {
/*
* 1.被400整除是闰年 2.不能被400整除的且能被4整除且不能被100整除的是闰年 3.其他的都不是闰年
*/
// 默认不是闰年
boolean flag = false;calendar.setTime(basicDate);
int year = calendar.get(Calendar.YEAR);
/* 判断各种是闰年的情况修改flag的值 */
// 能被400整除
if ((year % 400) == 0) {
flag = true;
// 能被4整除 && 不能被100整除则是闰年
} else if ((year % 4) == 0 && (year % 100) != 0) {
flag = true;
}// 其他情况都不是闰年
return flag;
}/**
* 返回basicDate 是 星期几
*
* @param basicDate
* 时间
* @return String
*/
public static String getDayOfWeekByDate(Date basicDate) {
return getFormattedDateAsString(basicDate, "E");
}/**
* 得到年份
*
* @param basicDate
* 时间
* @return
*/
public static int getYear(Date basicDate) {
calendar.setTime(basicDate);
return calendar.get(Calendar.YEAR);
}/**
* 得到月份
*
* @param basicDate
* 时间
* @return
*/
public static int getMonth(Date basicDate) {
calendar.setTime(basicDate);
return calendar.get(Calendar.MONTH) + 1;
}/**
* 得到日
*
* @param basicDate
* 时间
* @return
*/
public static int getDay(Date basicDate) {
calendar.setTime(basicDate);
return calendar.get(Calendar.DATE);
}/**
* 得到时
*
* @param basicDate
* 时间
* @return
*/
public static int getHour(Date basicDate) {
calendar.setTime(basicDate);
return calendar.get(Calendar.HOUR_OF_DAY);
}/**
* 得到分
*
* @param basicDate
* 时间
* @return
*/
public static int getMinute(Date basicDate) {
calendar.setTime(basicDate);
return calendar.get(Calendar.MINUTE);
}/**
* 得到秒
*
* @param basicDate
* 时间
* @return
*/
public static int getSecond(Date basicDate) {
calendar.setTime(basicDate);
return calendar.get(Calendar.SECOND);
}/**
* 得到年龄
*
* @param birthDate
* 出生日期
* @return
*/
public static int getAge(Date birthDate) {if (getYear(new Date()) - getYear(birthDate) < 0) {
throw new IllegalArgumentException("生日小于当前日期");
}return getYear(new Date()) - getYear(birthDate);
}/**
* 根据Date得到Calendar对象
*
* @param basicDate
* 时间
* @return Calendar
*/
public static Calendar getCalendarByDate(Date basicDate) {
calendar.setTime(basicDate);
return calendar;
}/**
* 根据Calendar得到Date
*
* @param thiscalendar
* Calendar對象
* @return
*/
public static Date getDateByCalendar(Calendar thiscalendar) {
return thiscalendar.getTime();
}/**
* 辅助用于在日期上加时间
*
* @param date
* @param calendarField
* @param amount
* @return
*/
private static Date add(Date date, int calendarField, int amount) {
if (date == null) {
throw new IllegalArgumentException("The date must not be null!");
} else {
calendar.setTime(date);
calendar.add(calendarField, amount);
return calendar.getTime();
}
}/**
* 在时间上加年
*
* @param basicDate
* 时间
* @param amount
* 增量
* @return Date
*/
public static Date addYears(Date basicDate, int amount) {
return add(basicDate, Calendar.YEAR, amount);
}/**
* 在时间上加月
*
* @param basicDate
* 时间
* @param amount
* 增量
* @return Date
*/
public static Date addMonths(Date basicDate, int amount) {
return add(basicDate, Calendar.MONTH, amount);
}/**
* 在时间上加周
*
* @param basicDate
* 时间
* @param amount
* 增量
* @return
*/
public static Date addWeeks(Date basicDate, int amount) {
return add(basicDate, Calendar.WEEK_OF_YEAR, amount);
}/**
* 在时间上加天数
*
* @param basicDate
* 时间
* @param amount
* 增量
* @return Date
*/
public static Date addDays(Date basicDate, int amount) {return add(basicDate, Calendar.DATE, amount);
}/**
* 在时间上加小时
*
* @param basicDate
* 时间
* @param amount
* 增量
* @return Date
*/
public static Date addHours(Date basicDate, int amount) {
return add(basicDate, Calendar.HOUR_OF_DAY, amount);
}/**
* 在时间上加分
*
* @param basicDate
* 时间
* @param amount
* 增量
* @return Date
*/
public static Date addMinutes(Date basicDate, int amount) {
return add(basicDate, Calendar.MINUTE, amount);
}/**
* 在时间上加秒
*
* @param date
* 时间
* @param amount
* 增量
* @return Date
*/
public static Date addSeconds(Date date, int amount) {
return add(date, Calendar.SECOND, amount);
}/**
* 在时间上加毫秒
*
* @param date
* 时间
* @param amount
* 增量
* @return Date
*/
public static Date addMilliseconds(Date date, int amount) {
return add(date, Calendar.MILLISECOND, amount);
}/**
* 将秒转换成 HH:mm:ss 格式
*
* @param seconds
* @return
*/
public static String getHHmmss(long seconds) {long h = seconds / 3600L;
long j = seconds % 3600L;
long m = j / 60L;
long s = j % 60L;String hh = String.valueOf(h);
String mm = String.valueOf(m);
String ss = String.valueOf(s);if (hh.length() < 2) {
hh = (new StringBuilder("0")).append(hh).toString();
}
if (mm.length() < 2) {
mm = (new StringBuilder("0")).append(mm).toString();
}
if (ss.length() < 2) {
ss = (new StringBuilder("0")).append(ss).toString();
}
return (new StringBuilder(String.valueOf(hh))).append(":").append(mm)
.append(":").append(ss).toString();}
/**
* 根据时间得到相应的long值
*
* @param basicDate
* 时间
* @return
*/
public static long getTimeMillisByDate(Date basicDate) {
return basicDate.getTime();
}/**
* 生成(>=min&&<=max)随机数
*
* @param min
* @param max
* @return
*/
public static long getRondom(long min, long max) {
return (long) (Math.random() * (max - min) + min);
}/**
* 得到当前时间串
*
* @return
*/
public static String getCurrentDateString() {
return getFormattedDateAsString(new Date(), "yyyy-MM-dd HH:mm:ss");
}/**
* 判断是否周末(周六、周天)
*
* @param basicDate
* @return
*/
public static boolean isWeekEnd(Date basicDate) {
boolean flag = false;calendar = getCalendarByDate(basicDate);
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
if (dayOfWeek == Calendar.SATURDAY || dayOfWeek == Calendar.SUNDAY) {
flag = true;
}return flag;
}/**
* 在源日期(basicDate)基础上加上amount个工作日(除去周六和周日)
*
* @param basicDate
* @param amount
* @return
*/
public static Date addWorkDays(Date basicDate, int amount) {calendar = getCalendarByDate(basicDate);
// 是否周末(周六和周日) 标识
boolean weekEndFlag = false;for (int i = 0; i < amount; i++) {
// 把源日期加一天
calendar.add(Calendar.DAY_OF_MONTH, 1);// 判断是否周末
weekEndFlag = isWeekEnd(calendar.getTime());// 是周末的话,时间照加,但是i的值不算数,就倒退 1
if (weekEndFlag) {
i--;
}
}
return calendar.getTime();
}
/*public static void main(String args[]) {
System.out.println();
}*/
}
网友评论