![JAR search and dependency download from the Maven repository](/logo.png)
com.github.commons.utils.DateUtil Maven / Gradle / Ivy
package com.github.commons.utils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate;
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 java.util.concurrent.TimeUnit;
public class DateUtil {
/** yyyy-MM-dd */
public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
/** yyyyMMdd */
public static final String DATE_FORMAT = "yyyyMMdd";
/** HH:mm:ss */
public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
/** yyyy-MM-dd HH:mm:ss */
public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
/** yyyy年MM月dd日 */
public static final String CN_DATE_FORMAT = "yyyy年MM月dd日";
/** yyyyMMddHHmmss */
public static final String DATE_FORMAT_TIME = "yyyyMMddHHmmss";
/** HHmmss */
public static final String TIME = "HHmmss";
/**
* 尝试把一个String按照指定的多个pattern进行转换,转换成功返回结果,失败返回null,如果值为空直接返回null
* @param value 需要转换为日期的字符串
* @param patterns 日期pattern,多个以[,]分割
* @return Date
*/
public static Date tryStr2Date(String value, String patterns) {
return tryStr2Date(value, StringUtils.split(patterns, ","));
}
/**
* 尝试把一个String按照指定的多个pattern进行转换,转换成功返回结果,失败返回null,如果值为空直接返回null
* @param value 需要转换为日期的字符串
* @param patterns 日期pattern数组
* @return Date
*/
public static Date tryStr2Date(String value, String [] patterns) {
Validate.notEmpty(patterns,"patterns 不能为空");
Date d = null;
if (StringUtils.isNotEmpty(value)) {
for (String p : patterns) {
try {
d = DateUtil.str2Date(value, p);
break;
} catch (Exception e) {
continue;
}
}
}
return d;
}
/**
* 返回当前时间的星期
* @param date 时间
* @throws Exception 异常
* @return 当前时间的星期
*/
public static int dayForWeek(Date date) throws Exception {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
c.setTime(format.parse(format.format(date)));
int dayForWeek = 0;
if (c.get(Calendar.DAY_OF_WEEK) == 1) {
dayForWeek = 7;
} else {
dayForWeek = c.get(Calendar.DAY_OF_WEEK) - 1;
}
return dayForWeek;
}
/**
* 按指定格式将字符串转换为日期
* @param dateStr 日期串
* @param pattern 格式
* @return 日期
*/
public static Date str2Date(String dateStr, String pattern){
if (StringUtils.isBlank(dateStr)) {
return null;
}
if (null == pattern) {
pattern = DEFAULT_DATE_FORMAT;
}
SimpleDateFormat format = new SimpleDateFormat();
format.applyPattern(pattern);
try {
return format.parse(dateStr);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
/**
* 将字符串转换为日期时间:yyyy-MM-dd
* @param dateStr 日期串
* @return 日期时间
*/
public static Date str2Date(String dateStr){
return str2Date(dateStr, null);
}
/**
* 将字符串转换为日期时间:yyyy-MM-dd HH:mm:ss
* @param dateStr 日期串
* @return 日期时间
*/
public static Date str2DateTime(String dateStr){
return str2DateTime(dateStr, null);
}
/**dateStr:yyyyMMddHHmmss
* 将字符串转换为日期时间:yyyy-MM-dd HH:mm:ss
* @param dateStr 日期串
* @return 日期时间
*/
public static Date strTwoDateTime(String dateStr) {
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(dateStr.substring(0, 4));
stringBuffer.append("-");
stringBuffer.append(dateStr.substring(4, 6));
stringBuffer.append("-");
stringBuffer.append(dateStr.substring(6, 8));
stringBuffer.append(" ");
stringBuffer.append(dateStr.substring(8, 10));
stringBuffer.append(":");
stringBuffer.append(dateStr.substring(10, 12));
stringBuffer.append(":");
stringBuffer.append(dateStr.substring(12, 14));
//String str = dateStr.substring(0, 4)+"-"+dateStr.substring(4, 6)+"-"+dateStr.substring(6, 8)+" "+dateStr.substring(8, 10)+":"+dateStr.substring(10, 12)+":"+dateStr.substring(12, 14);
return str2DateTime(stringBuffer.toString());
}
/**
* 按指定格式将字符串转换为日期时间
* @param dateStr 日期串
* @param pattern 格式
* @return 日期时间
*/
public static Date str2DateTime(String dateStr, String pattern){
if (StringUtils.isBlank(dateStr)) {
return null;
}
if (null == pattern) {
pattern = DEFAULT_DATE_TIME_FORMAT;
}
SimpleDateFormat format = new SimpleDateFormat();
format.applyPattern(pattern);
try {
return format.parse(dateStr);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
/**
* 将日期格式化为字符串
*
* @param date 日期
* @param pattern 格式
* @return 格式化后的日期串
*/
public static String date2Str(Date date, String pattern) {
if (null == date) {
return null;
}
if (null == pattern) {
pattern = DEFAULT_DATE_FORMAT;
}
SimpleDateFormat format = new SimpleDateFormat(pattern);
return format.format(date);
}
/**
* 将日期时间格式化为字符串
*
* @param date 日期
* @param pattern 格式
* @return 格式化后的日期时间串
*/
public static String dateTime2Str(Date date, String pattern) {
if (null == date) {
return null;
}
if (null == pattern) {
pattern = DEFAULT_DATE_TIME_FORMAT;
}
SimpleDateFormat format = new SimpleDateFormat(pattern);
return format.format(date);
}
/**
* 取得当前时间戳
*
* @return 当前时间戳
*/
public static String getCurrentTime() {
return new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
}
/**
* 取得当前日期
*
* @return 当前日期
*/
public static String thisDate() {
Calendar calendar = new GregorianCalendar();
calendar.setTime(new Date());
return new SimpleDateFormat(DEFAULT_DATE_FORMAT).format(calendar.getTime());
}
/**
* 取得当前时间
*
* @return 当前时间
*/
public static String thisTime() {
Calendar calendar = new GregorianCalendar();
calendar.setTime(new Date());
return new SimpleDateFormat(DEFAULT_TIME_FORMAT).format(calendar.getTime());
}
/**
* 取得当前完整日期时间
*
* @return 当前完整日期时间
*/
public static String thisDateTime() {
Calendar calendar = new GregorianCalendar();
calendar.setTime(new Date());
return new SimpleDateFormat(DEFAULT_DATE_TIME_FORMAT).format(calendar.getTime());
}
/**
* 获取某月最后一天的日期数字
*
* @param firstDate 日期
* @return 某月最后一天的日期数字
*/
public static int getLastDayOfMonth(Date firstDate){
Calendar cal = Calendar.getInstance();
cal.setTime(firstDate);
return cal.getActualMaximum(Calendar.DATE);
}
/**
* 取得今天的最小时间
*
* @return 今天的最小时间
*/
public static Date getTodayMin() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return cal.getTime();
}
/**
* 取得今天的最大时间
* @return 今天的最大时间
*/
public static Date getTodayMax() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
cal.set(Calendar.MILLISECOND, 999);
return cal.getTime();
}
/**
* 取得明天的最小时间
* @return 明天的最小时间
*/
public static Date getTomorrowMin() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
cal.add(Calendar.DATE, 1);
return cal.getTime();
}
/**
* 取得明天的最大时间
*
* @return 明天的最大时间
*/
public static Date getTomorrowMax() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
cal.set(Calendar.MILLISECOND, 999);
cal.add(Calendar.DATE, 1);
return cal.getTime();
}
/**
* 由指定时间、时间域、数额,计算时间值
* @param standard 指定时间
* @param type 时间域
* @param amount 数额
* @return 时间值
*/
public static Date genDiffDate(Date standard, int type, int amount) {
Calendar cal = Calendar.getInstance();
cal.setTime(standard);
cal.add(type, amount);
return cal.getTime();
}
/**
* 生成指定时间所在的小时段(清空:分钟、秒、毫秒)
* @param standard 指定时间
* @return 指定时间所在的小时段
*/
public static Date genHourStart(Date standard) {
Calendar cal = Calendar.getInstance();
cal.setTime(standard);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return cal.getTime();
}
/**
* 取得当前天后,减去指定天数后的最小时间
*
* @param date 当前日期
* @param beforeDay 天数
* @return 当前天后,减去指定天数后的最小时间
*/
public static Date getBeforeDayMin(Date date, int beforeDay) {
return getDayMin(date, -beforeDay);
}
/**
* 取得当前天后,减去指定天数后的最大时间
*
* @param date 当前日期
* @param beforeDay 天数
* @return 当前天后,减去指定天数后的最大时间
*/
public static Date getBeforeDayMax(Date date, int beforeDay) {
return getDayMax(date, -beforeDay);
}
/**
* 取得当前天后,加上指定天数后的最小时间
*
* @param date 当前日期
* @param afterDay 天数
* @return 当前天后,加上指定天数后的最小时间
*/
public static Date getAfterDayMin(Date date, int afterDay) {
return getDayMin(date, afterDay);
}
/**
* 取得当前天后,加上指定天数后的最大时间
*
* @param date 当前日期
* @param afterDay 天数
* @return 当前天后,加上指定天数后的最大时间
*/
public static Date getAfterDayMax(Date date, int afterDay) {
return getDayMax(date, afterDay);
}
/**
* 取得当前天后,加上指定天数后的最小时间
*
* @param date 当前日期
* @param addDay 天数
* @return 当前天后,加上指定天数后的最小时间
*/
public static Date getDayMin(Date date, int addDay) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
cal.add(Calendar.DATE, addDay);
return cal.getTime();
}
/**
* 取得当前天 ,加上指定天数后的最大时间
*
* @param date 当前日期
* @param addDay 天数
* @return 当前天 ,加上指定天数后的最大时间
*/
public static Date getDayMax(Date date, int addDay) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
cal.set(Calendar.MILLISECOND, 999);
cal.add(Calendar.DATE, addDay);
return cal.getTime();
}
/**
* 取得当前天 ,加上指定天数后的时间
*
* @param date 当前日期
* @param addDay 天数
* @return 当前天 ,加上指定天数后的时间
*/
public static Date addDays(Date date, int addDay) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.DATE, addDay);
return cal.getTime();
}
/**
* 取得当前天 ,加上指定月份数后的时间
*
* @param date 当前日期
* @param months 月份数
* @return 当前天 ,加上指定月份数后的时间
*/
public static Date addMonths(Date date, int months) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.MONTH, months);
return cal.getTime();
}
/**
* 日期差天数(按照时间比较,如果不足一天会自动补足)
* @param date1 开始日期
* @param date2 结束日期
* @return 两日期差天数
*/
public static int diff(Date date1, Date date2){
long day = TimeUnit.DAYS.toMillis(1);
String str1 = date2Str(date1, "yyyy-MM-dd");
date1 = str2Date(str1, "yyyy-MM-dd");
String str2 = date2Str(date2, "yyyy-MM-dd");
date2 = str2Date(str2, "yyyy-MM-dd");
return (int) (((date2.getTime() - date1.getTime()) / day));
}
/**
* 日期差天数(和当前时间比)
* @param date 比较日期
* @return 和当前日期差天数
*/
public static int diff(Date date){
return diff(new Date(), date);
}
/**
* 按固定格式比较两个日期
* @param date1 日期
* @param date2 日期2
* @param pattern 格式 默认:yyyy-MM-dd
* @return 比较结果
*/
public static int compareDate(Date date1, Date date2, String pattern) {
String d1 = date2Str(date1, pattern);
String d2 = date2Str(date2, pattern);
return d1.compareTo(d2);
}
/**
* 按固定格式比较两个日期+时间
*
* @param time1 日期时间
* @param time2 日期时间2
* @param pattern 格式 默认: yyyy-MM-dd HH:mm:ss
* @return 比较结果
*/
public static int compareDateTime(Date time1, Date time2, String pattern) {
String d1 = dateTime2Str(time1, pattern);
String d2 = dateTime2Str(time2, pattern);
return d1.compareTo(d2);
}
/**
* 判断是否是闰年
*
* @param date 日期
* @return boolean
*/
public static boolean isLeapyear(Date date) {
GregorianCalendar gregorianCalendar = new GregorianCalendar();
gregorianCalendar.setTime(date);
return gregorianCalendar.isLeapYear(gregorianCalendar.get(Calendar.YEAR));
}
/**
* 根据传入日期得到本月月末
* @param date 传入日期
* @return date 月末日期
*/
public static Date getLastDateOfMonth(Date date) {
Calendar c = Calendar.getInstance();
c.setTime(date);
return getLastDateOfMonth(c);
}
/**
* Description: 根据传入日期得到本月月初
* @param date 时间
* @return Date 本月月初
*/
public static Date getFirstDateOfMonth(Date date) {
Calendar c = Calendar.getInstance();
c.setTime(date);
return getFirstDateOfMonth(c);
}
/**
* 根据传入日期得到本月月初
* @param calendar 传入日期
* @return date 月末日期
*/
public static Date getFirstDateOfMonth(Calendar calendar) {
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
return calendar.getTime();
}
/**
* 根据传入日期得到本月月末
* @param calendar 传入日期
* @return date 月末日期
*/
public static Date getLastDateOfMonth(Calendar calendar) {
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
return calendar.getTime();
}
/**
* 根据传入日期得到本月月末,如果传入日期为月末则返回传入日期
* @param date 传入日期
* @return boolean true为是
*/
public static boolean isLastDateOfMonth(Date date) {
Calendar c = Calendar.getInstance();
c.setTime(date);
return isLastDateOfMonth(c);
}
/**
* 根据传入日期得到本月月末,如果传入日期为月末则返回传入日期
* @param date 传入日期
* @return boolean false为不是
*/
public static boolean isLastDateOfMonth(Calendar date) {
if (date.getActualMaximum(Calendar.DAY_OF_MONTH) == date.get(Calendar.DAY_OF_MONTH)) {
return true;
}
return false;
}
/**
* 根据日期得到年份
* @param date 日期
* @return 年份
*/
public static int getYear(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.get(Calendar.YEAR);
}
/**
* 根据日期得到月份
*
* @param date 日期
* @return 月份
*/
public static int getMonth(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.get(Calendar.MONTH) + 1;
}
/**
* 根据日期得到日
*
* @param date 日期
* @return 日
*/
public static int getDay(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.get(Calendar.DAY_OF_MONTH);
}
/**
* 时间格式化
*
* @param millonSeconds 毫秒
* @param language 语言
* @return time
*/
public static String formatMilliseconds(long millonSeconds, String language) {
String v = "";
long second = millonSeconds / 1000;// 转换为秒
long millonSecond = millonSeconds - second * 1000;// 多出的不足一秒的毫秒数
boolean isChinese = language.equalsIgnoreCase("chinese");
if (isChinese) {
v += millonSecond + "毫秒";
} else {
v += millonSecond + "ms.";
}
if (second > 0)// 如果还有秒
{
long minutes = second / 60;// 分钟取整
second = second - minutes * 60;// 不足一分钟的秒数
if (isChinese) {
v = second + "秒" + v;
} else {
v = second + "s" + v;
}
if (minutes > 0)// 如果还有分钟
{
long hours = minutes / 60;// 小时取整
minutes = minutes - hours * 60;// 不足一小时的分钟数
if (isChinese) {
v = minutes + "分" + v;
} else {
v = minutes + "minutes " + v;
}
if (hours > 0) {
long days = hours / 24;// 天取整
hours = hours - days * 24;// 不足一天的小时数
if (isChinese) {
v = hours + "小时" + v;
} else {
v = hours + "hours " + v;
}
if (days > 0) {
if (isChinese) {
v += days + "天" + v;
} else {
v += days + " days " + v;
}
}
}
}
}
return v;
}
/**
* 时间格式化
*
* @param millonSeconds 毫秒
* @return time
*/
public static String formatMilliseconds(long millonSeconds) {
return formatMilliseconds(millonSeconds, "CHINESE");
}
/**
* 计算两个日期之间相差的天数
* @param smdate 较小的时间
* @param bdate 较大的时间
* @return 相差天数
* @throws ParseException 异常
*/
public static int daysBetween(Date smdate,Date bdate) throws ParseException {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
smdate=sdf.parse(sdf.format(smdate));
bdate=sdf.parse(sdf.format(bdate));
Calendar cal = Calendar.getInstance();
cal.setTime(smdate);
long time1 = cal.getTimeInMillis();
cal.setTime(bdate);
long time2 = cal.getTimeInMillis();
long between_days=(time2-time1)/(1000*3600*24);
return Integer.parseInt(String.valueOf(between_days));
}
/**
* 字符串的日期格式的计算
* @param smdate 字符串1
* @param bdate 字符串2
* @return int 数字
* @throws ParseException 异常
*/
public static int daysBetween(String smdate,String bdate) throws ParseException{
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
cal.setTime(sdf.parse(smdate));
long time1 = cal.getTimeInMillis();
cal.setTime(sdf.parse(bdate));
long time2 = cal.getTimeInMillis();
long between_days=(time2-time1)/(1000*3600*24);
int parseInt = Integer.parseInt(String.valueOf(between_days));
return parseInt;
}
/**
* @param dateStr 開始日期
* @param span 月份跨度
* @return 字符串
* @throws ParseException 异常
*/
public static String getLastDay(String dateStr, int span) throws ParseException{
Calendar lastDate = Calendar.getInstance();
SimpleDateFormat c=new SimpleDateFormat("yyyy-MM-dd");
Date d = c.parse(dateStr);
lastDate.setTime(d);
lastDate.set(Calendar.DATE, 1);
lastDate.add(Calendar.MONTH, span);
lastDate.add(Calendar.DATE, -1);
return c.format(lastDate.getTime());
}
/**
* 时间相加
* @param time1 时间1
* @param time2 时间2
* @return String 时间之和
*/
public static String timeAdd(String time1, String time2){
String time = "00:00:00";
if (time1!=null&&time2!=null){
String c[] = time1.split(":");
String substring = c[0];
String substring1 = c[1];
String substring2 = c[2];
int i = Integer.parseInt(substring);
int i1 = Integer.parseInt(substring1);
int i2 = Integer.parseInt(substring2);
String f[] = time2.split(":");
String sub = f[0];
String sub1 = f[1];
String sub2 = f[2];
int in = Integer.parseInt(sub);
int in1 = Integer.parseInt(sub1);
int in2 = Integer.parseInt(sub2);
i2=i2+in2;
int ss = i2/60;
int dd = i2%60;
i1=i1+in1+ss;
int ss1 = i1/60;
int dd1 = i1%60;
i=i+in+ss1;
String dd1v= String.valueOf(dd1);
String ddv= String.valueOf(dd);
String iv= String.valueOf(i);
if(iv.length()==1){
if(dd1v.length()==1&&ddv.length()==1){
dd1v="0"+dd1v;
ddv="0"+ddv;
iv="0"+iv;
time = iv+":"+dd1v+":"+ddv;
return time;
}else if(ddv.length()==1&&dd1v.length()!=1){
ddv="0"+ddv;
iv="0"+iv;
time = iv+":"+dd1v+":"+ddv;
return time;
}else if(dd1v.length()==1&&ddv.length()!=1){
dd1v="0"+dd1v;
iv="0"+iv;
time = iv+":"+dd1v+":"+ddv;
return time;
}else{
iv="0"+iv;
time = iv+":"+dd1v+":"+ddv;
return time;
}
}else{
if(dd1v.length()==1&&ddv.length()==1){
dd1v="0"+dd1v;
ddv="0"+ddv;
time = i+":"+dd1v+":"+ddv;
return time;
}else if(ddv.length()==1&&dd1v.length()!=1){
ddv="0"+ddv;
time = i+":"+dd1+":"+ddv;
return time;
}else if(dd1v.length()==1&&ddv.length()!=1){
dd1v="0"+dd1v;
time = i+":"+dd1v+":"+dd;
return time;
}else{
time = i+":"+dd1+":"+dd;
return time;
}
}
}else if (time1!=null&&time2==null){
time=time1;
return time;
}else if (time1==null&&time2!=null){
time=time2;
return time;
}else{
return time;
}
}
public static String getYesterday() {
Calendar calendar = new GregorianCalendar();
calendar.setTime(new Date());
calendar.add(Calendar.DAY_OF_MONTH, -1);
return new SimpleDateFormat(DEFAULT_DATE_FORMAT).format(calendar.getTime());
}
public static String getTodayStr() {
DateFormat df = new SimpleDateFormat(DATE_FORMAT);
return df.format(new Date());
}
public static String thisDateTimeStr() {
Calendar calendar = new GregorianCalendar();
calendar.setTime(new Date());
return new SimpleDateFormat(DATE_FORMAT_TIME).format(calendar.getTime());
}
public static Long getNumber(String timeStr,Integer type){
if(StringUtils.isBlank(timeStr)){
return null;
}
Date date = str2Date(timeStr, DEFAULT_DATE_TIME_FORMAT);
String str = dateTime2Str(date, DATE_FORMAT_TIME);
if(type == null){
return Long.valueOf(str);
}
if(type == 0){//返回年月日的Integer
return Long.valueOf(str.substring(0,8));
}else if(type == 1){//返回时分秒的Integer
return Long.valueOf(str.substring(8,str.length()));
}else{
return Long.valueOf(str);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy