import java.sql.Time;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import org.joda.time.DateTime;
import org.joda.time.Minutes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class DateUtil {
/** LOGGER */
private static final Logger LOGGER = LoggerFactory.getLogger(DateUtil.class);
/** 完整时间 yyyy-MM-dd HH:mm:ss */
public static final String SIMPLE = "yyyy-MM-dd HH:mm:ss";
/** 完整时间 yyyy-MM-dd HH:mm:ss,SSS */
public static final String SIMPLEMS = "yyyy-MM-dd HH:mm:ss,SSS";
/** 年月日 yyyy-MM-dd */
public static final String DTSIMPLE = "yyyy-MM-dd";
/** 年月日(中文) yyyy年MM月dd日 */
public static final String DTSIMPLECHINESE = "yyyy年MM月dd日";
/** 年月日(无下划线) yyyyMMdd */
public static final String DTMONTH = "yyyyMM";
/** 年月日(无下划线) yyyyMMdd */
public static final String DTSHORT = "yyyyMMdd";
/** 年月日时(无下划线) yyyyMMddHH */
public static final String DTHOUR = "yyyyMMddHH";
/** 年月日时分(无下划线) yyyyMMddHHmm */
public static final String DTMIDDLE = "yyyyMMddHHmm";
/** 年月日时分秒(无下划线) yyyyMMddHHmmss */
public static final String DTLONG = "yyyyMMddHHmmss";
/** 时分秒 HH:mm:ss */
public static final String HMSFORMAT = "HH:mm:ss";
/** 时分 HH:mm */
public static final String HMFORMAT = "HH:mm";
/** 年-月-日 小时:分钟 yyyy-MM-dd HH:mm */
public static final String SIMPLEFORMAT = "yyyy-MM-dd HH:mm";
/** 年月日(中文) yyyy年MM月dd日 HH:mm */
public static final String DTSIMPLECHINESEWITHTIME = "yyyy年MM月dd日 HH:mm";
/** 年月日(中文) yyyy年MM月dd日 HH:mm:ss */
public static final String DTSIMPLECHINESEWITHTIMESECOND = "yyyy年MM月dd日 HH:mm:ss";
/** 年月日 , yyyy.MM.dd */
public static final String DTSIMPLEBY = "yyyy.MM.dd";
/** 月日 ,MMdd */
public static final String MONTHDAY = "MMdd";
/**
* 获取格式
*
* @param format 格式
* @return 获取格式
*/
public static final DateFormat getFormat(String format) {
return new SimpleDateFormat(format);
}
/**
* yyyy-MM-dd HH:mm:ss,SSS
*
* @param date 日期格式
* @return 获取日期类型String
*/
public static final String simplemsFormat(Date date) {
if (date == null) {
return "";
}
return getFormat(SIMPLEMS).format(date);
}
/**
* HH:mm
*
* @param date 日期格式
* @return 获取日期类型String
*/
public static final String hmFormat(Date date) {
if (date == null) {
return "";
}
return getFormat(HMFORMAT).format(date);
}
/**
* yyyy-MM-dd HH:mm:ss
*
* @param date 日期
* @return 日期String值
*/
public static final String simpleFormat(Date date) {
if (date == null) {
return "";
}
return getFormat(SIMPLE).format(date);
}
/**
* yyyy-MM-dd
*
* @param date 日期
* @return 日期String值
*/
public static final String dtSimpleFormat(Date date) {
if (date == null) {
return "";
}
return getFormat(DTSIMPLE).format(date);
}
/**
* HH:mm:ss
*
* @param time 时间
* @return 时间String值
*/
public static final String simpleFormat(Time time) {
if (time == null) {
return "";
}
return getFormat(HMSFORMAT).format(time);
}
/**
* yyyyMMdd
*
* @param date 日期
* @return 日期String值
*/
public static final String dtShortSimpleFormat(Date date) {
if (date == null) {
return "";
}
return getFormat(DTSHORT).format(date);
}
/**
* <pre>
* yyyyMMddHHmm
* </pre>
*
* @param date 日期
* @return 日期String值
*/
public static final String dtMiddleSimpleFormat(Date date) {
if (date == null) {
return "";
}
return getFormat(DTMIDDLE).format(date);
}
/**
* <pre>
* yyyyMMddHHmmss
* </pre>
*
* @param date 日期
* @return 日期String值
*/
public static final String dtLongSimpleFormat(Date date) {
if (date == null) {
return "";
}
return getFormat(DTLONG).format(date);
}
/**
* <pre>
* 获取日期String值
* </pre>
*
* @param strDate yyyyMMdd 日期
* @return yyyy-MM-dd 日期String值
*/
public static final String dtFromShortToSimpleStr(String strDate) {
if (null != strDate) {
Date date;
try {
date = shortstring2Date(strDate);
} catch (ParseException e) {
date = null;
}
if (null != date) {
return dtSimpleFormat(date);
}
}
return "";
}
/**
* yyyy-mm-dd 日期格式转换为日期
*
* @param strDate 日期String值
* @return 日期对象
*/
public static final Date strToDtSimpleFormat(String strDate) {
if (strDate == null) {
return null;
}
try {
return getFormat(DTSIMPLE).parse(strDate);
} catch (Exception e) {
LOGGER.error("格式化日期(strToDtSimpleFormat)异常。strDate={0}", strDate, e);
}
return null;
}
/**
* yyyy年MM月dd日
*
* @param date 日期对象
* @return 日期String值
*/
public static final String dtSimpleChineseFormat(Date date) {
if (date == null) {
return "";
}
return getFormat(DTSIMPLECHINESE).format(date);
}
/**
* yyyy-MM-dd到 yyyy年MM月dd日 转换
*
* @param date 日期String值 yyyy-MM-dd格式
* @return 日期String值 yyyy年MM月dd日格式
*/
public static final String dtSimpleChineseFormatStr(String date) throws ParseException {
if (date == null) {
return "";
}
return getFormat(DTSIMPLECHINESE).format(string2Date(date));
}
/**
* yyyy-MM-dd 日期字符转换为时间
*
* @param stringDate Sting类型的日期格式
* @return 日期类型
* @throws ParseException
*/
public static final Date string2Date(String stringDate) throws ParseException {
if (stringDate == null) {
return null;
}
return getFormat(DTSIMPLE).parse(stringDate);
}
/**
* 返回日期时间(Add by Sunzy)
*
* @param stringDate "yyyy-MM-dd HH:mm:ss"
* @return 日期类型
* @throws ParseException
*/
public static final Date string2DateTime(String stringDate) {
try {
if (stringDate == null) {
return null;
}
return getFormat(SIMPLE).parse(stringDate);
} catch (Exception e) {
LOGGER.error("[DateUtil.string2DateTime] error!", e);
}
return null;
}
/**
* 返回日期时间
*
* @param stringDate "yyyy-MM-dd HH:mm"
* @return 日期类型
* @throws ParseException
*/
public static final Date withoutSencendString2DateTime(String stringDate) throws ParseException {
if (stringDate == null) {
return null;
}
return getFormat(SIMPLEFORMAT).parse(stringDate);
}
/**
* 返回日期时间(Add by Gonglei)
*
* @param stringDate (yyyyMMdd)格式日期
* @return 日期对象
* @throws ParseException
*/
public static Date shortstring2Date(String stringDate) throws ParseException {
if (stringDate == null) {
return null;
}
return getFormat(DTSHORT).parse(stringDate);
}
/**
* 返回短日期格式(yyyyMMdd格式)
*
* @param date 日期格式对象
* @return 日期对象
* @throws ParseException
*/
public static String shortDate(Date date) {
if (date == null) {
return null;
}
return getFormat(DTSHORT).format(date);
}
/**
* 返回长日期格式(yyyyMMddHHmmss格式)
*
* @param date 日期信息
* @return String格式日期
* @throws ParseException
*/
public static String longDate(Date date) {
if (date == null) {
return null;
}
return getFormat(DTLONG).format(date);
}
/**
* 计算当前时间几小时之后的时间
*
* @param date 日期信息
* @param hours 小时信息
* @return 日期格式信息
*/
public static Date addHours(Date date, long hours) {
return addMinutes(date, hours * 60);
}
/**
* 计算当前时间几分钟之后的时间
*
* @param date 日期信息
* @param minutes 分钟信息
* @return 日期信息
*/
public static Date addMinutes(Date date, long minutes) {
return addSeconds(date, minutes * 60);
}
/**
* 计算当前时间几秒钟之后的时间
*
* @param date 日期信息
* @param secs 秒信息
* @return 日期信息
*/
public static Date addSeconds(Date date, long secs) {
return new Date(date.getTime() + (secs * 1000));
}
/**
* 返回日期相差天数,向下取整数
*
* @param dateStart 一般前者小于后者dateEnd
* @param dateEnd 截止时间
* @return 两者相差天数
*/
public static int countDays(Date dateStart, Date dateEnd) {
if ((dateStart == null) || (dateEnd == null)) {
return -1;
}
return (int)((dateEnd.getTime() - dateStart.getTime()) / (1000 * 60 * 60 * 24));
}
/**
* 返回日期相差完整天数,不向下取整
*
* @param dateStart 开始日期
* @param dateEnd 结束日期
* @return 日期相差天数
*/
public static final int countCompleteDays(Date dateStart, Date dateEnd) {
if ((dateStart == null) || (dateEnd == null)) {
return -1;
}
Date formatDateStart = null, formatDateEnd = null;
try {
formatDateStart = shortstring2Date(dtShortSimpleFormat(dateStart));
formatDateEnd = shortstring2Date(dtShortSimpleFormat(dateEnd));
} catch (ParseException e) {
LOGGER.error("格式化日期(countCompleteDays)异常。dateStart={0}, dateEnd={1}", dateStart, dateEnd, e);
return -1;
}
return countDays(formatDateStart, formatDateEnd);
}
/**
* 将字符串按format格式转换为date类型
*
* @param str 日期String值
* @param format 日期格式
* @return 日期信息
*/
public static Date string2Date(String str, String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
try {
return sdf.parse(str);
} catch (ParseException e) {
return null;
}
}
/**
* 加减天数
*
* @param aDate 日期
* @param days 天数
* @return 日期信息
*/
public static Date increaseDate(Date aDate, int days) {
Calendar cal = Calendar.getInstance();
cal.setTime(aDate);
cal.add(Calendar.DAY_OF_MONTH, days);
return cal.getTime();
}
/**
* 年月日(中文) yyyy年MM月dd日 HH:mm:ss
*
* @param date 日期信息
* @return 日期字符串值
*/
public static final String dtSimpleChineseFormatWithTimeSecond(Date date) {
if (date == null) {
return "";
}
return getFormat(DTSIMPLECHINESEWITHTIMESECOND).format(date);
}
/**
* 计算当前时间后几个天的时间.
*
* @param date 当前时间.
* @param days 天数.
* @return 当前时间后几个天的时间.
*/
public static Date addDays(final Date date, final int days) {
Calendar calendar = new GregorianCalendar();
calendar.setTime(date);
//化整为零,化一天为24小时
final int hour = 24;
calendar.add(Calendar.HOUR, days * hour);
return calendar.getTime();
}
/**
* 计算当前时间后几个年的时间.
*
* @param date 当前时间.
* @param years 年数.
* @return 当前时间后几个年的时间.
*/
public static Date addYears(final Date date, final int years) {
Calendar calendar = new GregorianCalendar();
calendar.setTime(date);
calendar.add(Calendar.YEAR, years);
return calendar.getTime();
}
/**
* 据出生日期计算年龄("yyyy-MM-dd").
*
* @param strBirthDay 字符串格式的出生日期.
* @return 年龄.
* @throws Exception 系统异常.
*/
public static int getAgeByBirthday(final String strBirthDay) throws Exception {
return getAgeByBirthday(strBirthDay, DTSIMPLE);
}
/**
* 根据出生日期计算年龄.
*
* @param strBirthDay 字符串型日期.
* @param format 日期格式.
* @return 未来日期返回0.
* @throws Exception 系统异常.
*/
public static int getAgeByBirthday(final String strBirthDay, final String format) throws Exception {
DateFormat dateFormat = new SimpleDateFormat(format);
Date birthDay = dateFormat.parse(strBirthDay);
return getAgeByBirthday(birthDay);
}
/**
* 根据出生日期计算年龄.
*
* @param birthDay 出生日期.
* @return 年龄(未来日期返回0).
* @throws Exception 系统异常.
*/
public static int getAgeByBirthday(final Date birthDay) throws Exception {
Calendar cal = Calendar.getInstance();
if (cal.before(birthDay)) {
return 0;
}
int yearNow = cal.get(Calendar.YEAR);
int monthNow = cal.get(Calendar.MONTH);
int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH);
cal.setTime(birthDay);
int yearBirth = cal.get(Calendar.YEAR);
int monthBirth = cal.get(Calendar.MONTH);
int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH);
int age = yearNow - yearBirth;
if (monthNow <= monthBirth) {
if (monthNow == monthBirth) {
if (dayOfMonthNow < dayOfMonthBirth) {
age--;
}
} else {
age--;
}
}
return age;
}
/**
* 转换成yyy.MM.dd
*
* @param date 日期信息
* @return String格式日期信息
*/
public static String getWebDateString(Date date) {
DateFormat dateFormat = new SimpleDateFormat(DTSIMPLEBY);
if (date == null) {
return "";
}
return dateFormat.format(date);
}
/**
* 将YYYYMMDD 转换成 YYYY.MM.DD
*
* @param dateString 日期信息
* @return String值
*/
public static String convert2WebFormat(String dateString) {
DateFormat df1 = new SimpleDateFormat(DTSHORT);
DateFormat df2 = new SimpleDateFormat(DTSIMPLEBY);
return convert(dateString, df1, df2);
}
/**
* Convert 转换方法
*
* @param dateString 日期String值
* @param formatIn 起始类型
* @param formatOut 目标类型
* @return 返回日期格式
*/
public static String convert(String dateString, DateFormat formatIn, DateFormat formatOut) {
try {
Date date = formatIn.parse(dateString);
return formatOut.format(date);
} catch (ParseException e) {
LOGGER.error("格式化日期(convert)异常。dateString={0},formatIn={1},formatOut={2}", dateString, formatIn, formatOut,
e);
return "";
}
}
/**
* 比当前时间要晚
*
* @param date 需要比较的日期
* @return 是否比当前时间晚
*/
public static boolean isAfterNow(Date date) {
try {
if (date == null) {
return false;
}
DateFormat df1 = new SimpleDateFormat(DTSHORT);
Date nowdate = df1.parse(df1.format(new Date()));
return date.compareTo(nowdate) <= 0;
} catch (Exception e) {
LOGGER.error("日期格式转换(isAfterNow)异常。date={0}", date, e);
throw new RuntimeException("isAfterNow:日期格式转换异常", e);
}
}
/**
* MMdd
*
* @param date 日期信息
* @return 日期String值
*/
public static String dtSimpleFormatMD(Date date) {
if (date == null) {
return "";
}
return getFormat(MONTHDAY).format(date);
}
/**
* 返回日期时间
*
* @param stringDate (yyyyMMddHHmmss)
* @return 日期信息
* @throws ParseException
*/
public static Date shortStringToDate(String stringDate) {
try {
if (stringDate == null) {
return null;
}
return getFormat(DTLONG).parse(stringDate);
} catch (Exception e) {
return null;
}
}
/**
* 拿到昨天0点的时间
*
* @return
*/
public static Date getYesterday() {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.DAY_OF_YEAR, -1);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
return calendar.getTime();
}
/**
* 拿到当天0点的时间
*
* @return
*/
public static Date getToday() {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
return calendar.getTime();
}
/**
* 拿到明天0点的时间
*
* @return
*/
public static Date getTomorrow() {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.DAY_OF_YEAR, 1);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
return calendar.getTime();
}
/**
* @return 返回当天的结束时间
*/
public static Date getEndTime() {
Calendar todayEnd = Calendar.getInstance();
todayEnd.set(Calendar.HOUR_OF_DAY, 23);
todayEnd.set(Calendar.MINUTE, 59);
todayEnd.set(Calendar.SECOND, 58);
return todayEnd.getTime();
}
/**
* @return 返回当天的结束时间
*/
public static Date getEndTime(int hh, int mm, int ss) {
Calendar todayEnd = Calendar.getInstance();
todayEnd.set(Calendar.HOUR_OF_DAY, hh);
todayEnd.set(Calendar.MINUTE, mm);
todayEnd.set(Calendar.SECOND, ss);
return todayEnd.getTime();
}
public static Date getLastTime() {
Calendar todayEnd = Calendar.getInstance();
todayEnd.set(Calendar.HOUR_OF_DAY, 23);
todayEnd.set(Calendar.MINUTE, 59);
todayEnd.set(Calendar.SECOND, 59);
return todayEnd.getTime();
}
/**
* @return 返回第二天的结束时间
*/
public static Date getTomorrowEndTime() {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.DAY_OF_YEAR, 1);
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 58);
return calendar.getTime();
}
/**
* 获取某一天的开始时间
*
* @param increase 时间增量。0:当天;1:明天;2:后天。以此类推
* @return
*/
public static Date getSpecifyDayStartTime(int increase) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.DAY_OF_YEAR, increase);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
return calendar.getTime();
}
/**
* 获取某一天的结束时间
*
* @param increase 时间增量。0:当天;1:明天;2:后天。以此类推
* @return
*/
public static Date getSpecifyDayEndTime(int increase) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.DAY_OF_YEAR, increase);
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 58);
return calendar.getTime();
}
public static Date getStartDate(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTime();
}
public static Date getEndDate(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
calendar.set(Calendar.MILLISECOND, 999);
return calendar.getTime();
}
public static Long subDate2Time(Date date) {
if (null == date) {
return null;
}
SimpleDateFormat format = new SimpleDateFormat(HMSFORMAT);
String hms = format.format(date);
try {
return format.parse(hms).getTime();
} catch (ParseException e) {
return null;
}
}
public static int dateBetweenMinute(Date start, Date end) {
DateTime startTime = new DateTime(start);
DateTime endTime = new DateTime(end);
return Minutes.minutesBetween(startTime, endTime).getMinutes();
}
public static int getDayNumber(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.get(Calendar.DAY_OF_WEEK);
}
}
日期工具类
最新推荐文章于 2025-01-21 18:29:51 发布