package com.item.util;
import com.item.base.common.utils.StringUtils;
import org.apache.commons.lang.time.DateFormatUtils;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
/**
* 用途描述 日期工具类
*
* @author list
* @version v0.1
* @company
* @date 2020-06-09 08:49
*/
public class DateUtil {
private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
private static SimpleDateFormat formatDateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private static final String yyyy_MM_ddHH_mm_ss = "yyyy-MM-dd HH:mm:ss";
private static final String yyyyMMddHHmmss = "yyyyMMddHHmmss";
private static final String yyyy_MM_dd = "yyyy-MM-dd";
private static final String yyyy__MM__dd = "yyyy/MM/dd";
public static final String PATTERN_STANDARD = "yyyy-MM-dd HH:mm:ss";
public static final String PATTERN_DATE = "yyyy-MM-dd";
private static SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
private static String[] parsePatterns = {"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm"};
public static Long getTimeFromNow(Timestamp timestamp) {
long time = new Timestamp(System.currentTimeMillis()).getTime();
long timestampTime = timestamp.getTime();
long result = (time - timestampTime) / 1000;
long finalTime = 300 - result;
if (timestampTime < time && (finalTime > 0 && finalTime <= 300)) {
return finalTime;
}
return 0L;
}
public static int daysBetween(String smallDate,String bigDate){
Date dateSmall = DateUtil.string2Date(smallDate, "yyyy-MM-dd");
Date dateBig = DateUtil.string2Date(bigDate, "yyyy-MM-dd");
if(dateBig.after(dateSmall)){
try {
return daysBetween(dateSmall, dateBig);
} catch (ParseException e) {
e.printStackTrace();
}
}else{
try {
return daysBetween(dateBig, dateSmall);
} catch (ParseException e) {
e.printStackTrace();
}
}
return 0;
}
/**
* 功能描述 计算两个日期之间相差的天数
*
* @param smallDate 在前的日期
* @param bigDate 在后的日期
* @return int
* @author list
* @version 1.0
* @date 2020-06-09 11:05
*/
public static int daysBetween(Date smallDate, Date bigDate) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat();
smallDate = sdf.parse(sdf.format(smallDate));
bigDate = sdf.parse(sdf.format(bigDate));
long smallTime;
long bigTime;
if (bigDate.after(smallDate)) {
smallTime = smallDate.getTime();
bigTime = bigDate.getTime();
} else {
smallTime = bigDate.getTime();
bigTime = smallDate.getTime();
}
long daysBetween = (bigTime - smallTime) / (24 * 3600 * 1000);
return Integer.parseInt(String.valueOf(daysBetween));
}
/**
* 功能描述 计算两个日期差,差的形式为:xx日xx时xx分xx秒xx毫秒
*
* @param smallDate 在前的日期
* @param bigDate 在后的日期
* @return java.lang.String
* @author list
* @version 1.0
* @date 2020-06-09 16:25
*/
public static String datesBetween(Date smallDate, Date bigDate) {
if (smallDate == null || bigDate == null) {
return null;
}
if (bigDate.after(smallDate)) {
return translate(bigDate.getTime() - smallDate.getTime());
} else {
return translate(smallDate.getTime() - bigDate.getTime());
}
}
/**
* 功能描述 将给定的毫秒值转换为:xx日xx时xx分xx秒xx毫秒
*
* @param time 输入的毫秒值
* @return java.lang.String
* @author list
* @version 1.0
* @date 2020-06-09 15:54
*/
public static String translate(long time) {
long millisecond = time % 1000;
long temp = time / 1000;
long day = temp / (24 * 3600);
long hour = (temp % (24 * 3600)) / (3600);
long minute = (temp % (24 * 3600) % (3600)) / (60);
// long second = (temp % (24 * 3600) % (3600)) % (60);
long second = temp % (60);//比上一行的计算省时间
StringBuilder sb = new StringBuilder();
sb.append(day == 0 ? "" : day + " day ").append(hour == 0 && StringUtils.isNotNull(sb.toString()) ? "" : hour + " hour ").append(minute == 0 && StringUtils.isNotNull(sb.toString()) ? "" : minute + " minute ").append(second == 0 && StringUtils.isNotNull(sb.toString()) ? "" : second + " second ").append(millisecond == 0 && StringUtils.isNotNull(sb.toString()) ? "" : millisecond + " millisecond");
return sb.toString();
}
/**
* 功能描述 为指定的Date增加/减少一定数量的minutes
*
* @param date 基准
* @param minutes 增加/减少的分钟数
* @return java.util.Date
* @author list
* @version 1.0
* @date 2020-06-09 17:22
*/
public static Date addMinute(Date date, int minutes) {
return addOrSubtract(date, Calendar.MINUTE, minutes);
}
/**
* 功能描述 为指定的Date增加/减少一定数量的days
*
* @param date 基准
* @param days 增加/减少的天数
* @return java.util.Date
* @author list
* @version 1.0
* @date 2020-06-09 17:24
*/
public static Date addDays(Date date, int days) {
return addOrSubtract(date, Calendar.DATE, days);
}
/**
* 功能描述 为指定的Date增加/减少一定数量的月份
*
* @param date 基准
* @param months 增加/减少的月份
* @return java.util.Date
* @author list
* @version 1.0
* @date 2020-06-09 17:25
*/
public static Date addMonths(Date date, int months) {
return addOrSubtract(date, Calendar.MONTH, months);
}
/**
* 功能描述 为指定的Date增加/减少一定数量的年份
*
* @param date 基准
* @param years 增加/减少的月份
* @return java.util.Date
* @author list
* @version 1.0
* @date 2020-07-29 11:31
*/
public static Date addYears(Date date, int years) {
return addOrSubtract(date, Calendar.YEAR, years);
}
/**
* 功能描述 某一天的零点
*
* @param date
* @return java.util.Date
* @author list
* @version 1.0
* @date 2020-07-29 11:52
*/
public static Date zeroInDay(Date date) {
Calendar instance = Calendar.getInstance();
instance.setTime(date);
instance.set(Calendar.HOUR_OF_DAY, 0);
instance.set(Calendar.MINUTE, 0);
instance.set(Calendar.SECOND, 0);
return instance.getTime();
}
/**
* 功能描述 某时刻月初零点
*
* @param date
* @return java.util.Date
* @author list
* @version 1.0
* @date 2020-07-29 11:52
*/
public static Date firstZeroInMonth(Date date) {
Calendar instance = Calendar.getInstance();
instance.setTime(date);
instance.set(Calendar.DAY_OF_MONTH, 1);
Date date1 = zeroInDay(instance.getTime());
return date1;
}
/**
* 功能描述 某时刻当年1月1日零点
*
* @param date
* @return java.util.Date
* @author list
* @version 1.0
* @date 2020-07-29 11:52
*/
public static Date firstZeroInYear(Date date) {
Calendar instance = Calendar.getInstance();
instance.setTime(date);
instance.set(Calendar.MONTH, 0);
Date date1 = firstZeroInMonth(instance.getTime());
return date1;
}
/**
* 功能描述 前一天的此时刻
*
* @param date
* @return java.util.Date
* @author list
* @version 1.0
* @date 2020-07-29 11:52
*/
public static Date theDayBefore(Date date) {
Calendar instance = Calendar.getInstance();
instance.setTime(date);
int newDay = instance.get(Calendar.DAY_OF_MONTH);
instance.set(Calendar.DAY_OF_MONTH, newDay - 1);
return instance.getTime();
}
public static Date todayEnd(Date date){
Calendar instance = Calendar.getInstance();
instance.setTime(date);
instance.set(Calendar.HOUR,23);
instance.set(Calendar.MINUTE,59);
instance.set(Calendar.SECOND,59);
return instance.getTime();
}
/**
* 功能描述 前一个月的此时刻,若上个月无29号,则顺延到1号
*
* @param date
* @return java.util.Date
* @author list
* @version 1.0
* @date 2020-07-29 11:52
*/
public static Date theDayInLastMonth(Date date) {
Calendar instance = Calendar.getInstance();
instance.setTime(date);
int newMonth = instance.get(Calendar.MONTH);
instance.set(Calendar.MONTH, newMonth - 1);
return instance.getTime();
}
/**
* 功能描述 前一年的此时刻,若上一年无29号,则顺延到1号
*
* @param date
* @return java.util.Date
* @author list
* @version 1.0
* @date 2020-07-29 11:52
*/
public static Date theDayInLastYear(Date date) {
Calendar instance = Calendar.getInstance();
instance.setTime(date);
int newMonth = instance.get(Calendar.YEAR);
instance.set(Calendar.YEAR, newMonth - 1);
return instance.getTime();
}
/**
* 功能描述 当前日期的年份
*
* @param date
* @return int
* @author list
* @version 1.0
* @date 2020-07-31 16:12
*/
public static int inYear(Date date) {
Calendar instance = Calendar.getInstance();
instance.setTime(date);
return instance.get(Calendar.YEAR);
}
/**
* 功能描述 当前日期的月份(从一开始)
*
* @param date
* @return int
* @author list
* @version 1.0
* @date 2020-07-31 16:13
*/
public static int inMonth(Date date) {
Calendar instance = Calendar.getInstance();
instance.setTime(date);
return instance.get(Calendar.MONTH) + 1;
}
/**
* 功能描述 当前日期的Day值
*
* @param date
* @return int
* @author list
* @version 1.0
* @date 2020-07-31 16:13
*/
public static int onDay(Date date) {
Calendar instance = Calendar.getInstance();
instance.setTime(date);
return instance.get(Calendar.DAY_OF_MONTH);
}
/**
* 功能描述 当前日期的所在季度(1、2、3、4)
*
* @param date
* @return int
* @author list
* @version 1.0
* @date 2020-07-31 16:14
*/
public static int isQuarter(Date date) {
int month = inMonth(date);
return month / 3 + 1;
}
/**
* 功能描述 为指定的Date增加/减少一定数量的field.(field由Calendar类的final变量指定)
*
* @param date 基准
* @param field 用于增加/减少的字段
* @param amount 增加/减少的数量
* @return java.util.Date
* @author list
* @version 1.0
* @date 2020-06-09 16:56
*/
public static Date addOrSubtract(Date date, int field, int amount) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(field, amount);
Date afterTime = calendar.getTime();
return afterTime;
}
/**
* 功能描述 格式化日期
*
* @param date 传入需格式化的日期
* @return java.lang.String
* @author list
* @version 1.0
* @date 2020-06-09 17:33
*/
public static String format(Date date) {
return format.format(date);
}
/**
* 功能描述 格式化日期时间
*
* @param date 传入需格式化的日期
* @return java.lang.String
* @author list
* @version 1.0
* @date 2020-06-09 17:33
*/
public static String formatDateTime(Date date) {
return formatDateTime.format(date);
}
/**
* 得到某月份的第一天(yyyy-MM-dd)。如参数为空,则得到当前月份的第一天
*
* @param dealDate
* @return
*/
public static String getMonthFirstDay(Date dealDate) {
Calendar calendar = Calendar.getInstance();
if (dealDate != null) {
calendar.setTime(dealDate);
}
calendar.set(Calendar.DATE, 1);
return df.format(calendar.getTime());
}
public static Date getMonthFirstDayForDate(Date dealDate) {
Calendar instance = Calendar.getInstance();
instance.setTime(dealDate);
instance.set(Calendar.DATE, 1);
instance.set(Calendar.HOUR_OF_DAY, 0);
instance.set(Calendar.MINUTE, 0);
instance.set(Calendar.SECOND, 0);
return instance.getTime();
}
// public int calcTimeSeconds(Date startDate, Date endDate){
//
// }
public static String calcDiffDate(Date startDate, Date endDate) {
long diffSeconds = endDate.getTime() - startDate.getTime();
long day = diffSeconds / (24 * 60 * 60 * 1000);
long hour = (diffSeconds / (60 * 60 * 1000) - day * 24);
long min = ((diffSeconds / (60 * 1000)) - day * 24 * 60 - hour * 60);
long s = (diffSeconds / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
return "" + day + "天" + hour + "小时" + min + "分" + s + "秒";
}
/**
* 得到某月份的最后一天(yyyy-MM-dd)。如参数为空,则得到当前月份的最后一天
*
* @param dealDate
* @return
*/
public static String getMonthLastDay(Date dealDate) {
Calendar calendar = Calendar.getInstance();
if (dealDate != null) {
calendar.setTime(dealDate);
}
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
return df.format(calendar.getTime());
}
/**
* 得到某个日期之后的几个月后的日期
*
* @param lastDealDate 上次处理的日期
* @param intervalMonths 间隔的月份
* @return
*/
public static String getNextDealDate(Date lastDealDate, int intervalMonths) {
Calendar cal = Calendar.getInstance();
cal.setTime(lastDealDate);
cal.add(Calendar.MONTH, intervalMonths);
return df.format(cal.getTime());
}
/**
* 获取某个日期间隔几天后的日期
*
* @param curentDate
* @param intervalDays
* @return
* @throws ParseException
*/
public static String getFutureDate(Date curentDate, int intervalDays) throws ParseException {
Calendar cal = Calendar.getInstance();
cal.setTime(curentDate);
cal.add(Calendar.DAY_OF_MONTH, intervalDays);
return df.format(cal.getTime());
}
/**
* 将String类型的日期转换成Date类型
*
* @param strDate
* @return
* @throws Exception
*/
public static Date toDate(String strDate) throws Exception {
if (StringUtils.isEmpty(strDate)) {
throw new Exception("格式化日期出错!");
}
return df.parse(strDate);
}
public static String getToday() throws Exception {
return df.format(new Date());
}
/**
* 将Date型日期转为String类型
*
* @param date
* @return
* @throws Exception
*/
public static String dateToString(Date date) throws Exception {
return df.format(date);
}
/**
* 得到当前日期字符串 格式(yyyy-MM-dd)
*/
public static String getDate() {
return getDate("yyyy-MM-dd");
}
/**
* 得到当前日期字符串 格式(yyyyMM)
*/
public static String getMonthDate() {
return getDate("yyyyMM");
}
/**
* 得到当前日期字符串 格式(yyyyMMDD)
*/
public static String getDayDate() {
return getDate("yyyyMMdd");
}
/**
* 得到当前日期字符串 格式(yyyy-MM-dd) pattern可以为:"yyyy-MM-dd" "HH:mm:ss" "E"
*/
public static String getDate(String pattern) {
return DateFormatUtils.format(new Date(), pattern);
}
/**
* 得到给定日期字符串 格式(yyyy-MM-dd) pattern可以为:"yyyy-MM-dd" "HH:mm:ss" "E"
*
* @throws ParseException
*/
public static String getFormatDate(String string, String pattern) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date time = sdf.parse(string);
return DateFormatUtils.format(time, pattern);
}
/**
* 得到日期字符串 默认格式(yyyy-MM-dd) pattern可以为:"yyyy-MM-dd" "HH:mm:ss" "E"
*/
public static String formatDate(Date date, Object... pattern) {
String formatDate = null;
if (pattern != null && pattern.length > 0) {
formatDate = DateFormatUtils.format(date, pattern[0].toString());
} else {
formatDate = DateFormatUtils.format(date, "yyyy-MM-dd");
}
return formatDate;
}
public static String getNoSepStrDate() {
String tempDate = formatDate(new Date(), "yyyy-MM-dd HH:mm:ss");
return tempDate.replace("-", "").replace(":", "").replace(" ", "");
}
/**
* 得到当前时间字符串 格式(HH:mm:ss)
*/
public static String getTime() {
return formatDate(new Date(), "HH:mm:ss");
}
/**
* 得到当前日期和时间字符串 格式(yyyy-MM-dd HH:mm:ss)
*/
public static String getDateTime() {
return formatDate(new Date(), "yyyy-MM-dd HH:mm:ss");
}
/**
* 得到当前年份字符串 格式(yyyy)
*/
public static String getYear() {
return formatDate(new Date(), "yyyy");
}
/**
* 得到当前月份字符串 格式(MM)
*/
public static String getMonth() {
return formatDate(new Date(), "MM");
}
public static String getMonth(Date date) {
return formatDate(date, "MM");
}
/**
* 得到当天字符串 格式(dd)
*/
public static String getDay() {
return formatDate(new Date(), "dd");
}
/**
* 得到小时字符串 格式(hh)
*/
public static String getHour() {
return formatDate(new Date(), "HH");
}
/**
* 得到分钟字符串 格式(hh)
*/
public static String getMinute() {
return formatDate(new Date(), "mm");
}
/**
* 得到秒钟字符串 格式(hh)
*/
public static String getSecond() {
return formatDate(new Date(), "ss");
}
/**
* 得到当前星期字符串 格式(E)星期几
*/
public static String getWeek() {
return formatDate(new Date(), "E");
}
/**
* 获取过去的天数
*
* @param date
* @return
*/
public static long pastDays(Date date) {
long t = new Date().getTime() - date.getTime();
return t / (24 * 60 * 60 * 1000);
}
public static String date2String(Date date, String pattern) {
if (date == null) {
throw new IllegalArgumentException("timestamp null illegal");
}
if (pattern == null || pattern.equals("")) {
pattern = PATTERN_STANDARD;
}
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
return sdf.format(date);
}
public static Date string2Date(String strDate, String pattern) {
if (strDate == null || strDate.equals("")) {
throw new RuntimeException("str date null");
}
if (pattern == null || pattern.equals("")) {
pattern = PATTERN_DATE;
}
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
Date date = null;
try {
date = sdf.parse(strDate);
} catch (ParseException e) {
throw new RuntimeException(e);
}
return date;
}
public static Date getStartTimeOfDate(Date currentDate) {
String strDateTime = date2String(currentDate, "yyyy-MM-dd") + " 00:00:00";
return string2Date(strDateTime, "yyyy-MM-dd hh:mm:ss");
}
public static Date getEndTimeOfDate(Date currentDate) {
String strDateTime = date2String(currentDate, "yyyy-MM-dd") + " 23:59:59";
return string2Date(strDateTime, "yyyy-MM-dd hh:mm:ss");
}
public static String getStartTimeStringOfDate(Date currentDate) {
return date2String(currentDate, "yyyy-MM-dd") + " 00:00:00";
}
public static String getEndTimeStringOfDate(Date currentDate) {
return date2String(currentDate, "yyyy-MM-dd") + " 23:59:59";
}
public static Date getFirstDayOfMonth(Calendar c) {
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = 1;
c.set(year, month, day, 0, 0, 0);
return c.getTime();
}
public static Date getLastDayOfMonth(Calendar c) {
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH) + 1;
int day = 1;
if (month > 11) {
month = 0;
year = year + 1;
}
c.set(year, month, day - 1, 0, 0, 0);
return c.getTime();
}
public static boolean isToday(String str, String formatStr) throws Exception {
SimpleDateFormat format = new SimpleDateFormat(formatStr);
Date date = null;
try {
date = format.parse(str);
} catch (ParseException e) {
throw e;
}
Calendar c1 = Calendar.getInstance();
c1.setTime(date);
int year1 = c1.get(Calendar.YEAR);
int month1 = c1.get(Calendar.MONTH) + 1;
int day1 = c1.get(Calendar.DAY_OF_MONTH);
Calendar c2 = Calendar.getInstance();
c2.setTime(new Date());
int year2 = c2.get(Calendar.YEAR);
int month2 = c2.get(Calendar.MONTH) + 1;
int day2 = c2.get(Calendar.DAY_OF_MONTH);
if (year1 == year2 && month1 == month2 && day1 == day2) {
return true;
}
return false;
}
/**
* 计算当前时间的前天12点或者当前时间的后天时间,hour为0表示0点为12表示12点
* @param amount
*/
public static Date calculateTwelve(Integer amount,Integer hour,Integer minute,Integer second){
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar c = Calendar.getInstance();
c.add(Calendar.DAY_OF_YEAR, amount);
c.set(Calendar.HOUR_OF_DAY, hour);
c.set(Calendar.MINUTE, minute);
c.set(Calendar.SECOND, second);
c.set(Calendar.MILLISECOND, 0);
System.out.println(df.format(c.getTime()));
return c.getTime();
}
/**
* 获取当天凌晨日期
* @return
*/
public static Timestamp getNowDayZero(){
long current=System.currentTimeMillis();//当前时间毫秒数
long zero=current/(1000*3600*24)*(1000*3600*24)- TimeZone.getDefault().getRawOffset();//今天零点零分零秒的毫秒数
return new Timestamp(zero);
}
public static void main(String[] args) {
long current=System.currentTimeMillis();//当前时间毫秒数
long zero=current/(1000*3600*24)*(1000*3600*24)- TimeZone.getDefault().getRawOffset();//今天零点零分零秒的毫秒数
long twelve=zero+24*60*60*1000-1;//今天23点59分59秒的毫秒数
long yesterday=System.currentTimeMillis()-24*60*60*1000;//昨天的这一时间的毫秒数
System.out.println(new Timestamp(current));//当前时间
System.out.println(new Timestamp(yesterday));//昨天这一时间点
System.out.println(new Timestamp(zero));//今天零点零分零秒
System.out.println(new Timestamp(twelve));//今天23点59分59秒
System.out.println(getMMByStr("202102"));
}
/*public static void main(String[] args) throws ParseException {
//System.out.println(onDay(new Date()));
calculateTwelve(-1,0,0,0);
calculateTwelve(-1,23,59,59);
calculateTwelve(0,0,0,0);
calculateTwelve(0,23,59,59);
}*/
/*
* Wed Jul 29 00:00:00 CST 2020
* Wed Jul 01 00:00:00 CST 2020
* Wed Jul 01 00:00:00 CST 2020
* Thu Jul 02 00:00:00 CST 2020
* Sat Feb 01 00:00:00 CST 2020
* Sat Feb 01 00:00:00 CST 2020
* Wed Jan 01 00:00:00 CST 2020
* */
/**
*
* @param yyyyMM
* @return
*/
public static String getMMByStr(String yyyyMM){
String substring = yyyyMM.substring(4);
if(substring.startsWith("0")){
return substring.substring(1);
}
return yyyyMM.substring(4);
}
}
日期工具类
最新推荐文章于 2024-07-09 16:46:46 发布