java8时间封装
java8时间封装
import cn.hutool.core.date.DateTime;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.cxmall.common.constants.Constants;
import cn.cxmall.common.exception.CxmallException;
import cn.cxmall.common.vo.dateLimitUtilVo;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
* Date工具类
* +----------------------------------------------------------------------
*/
public final class DateUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(DateUtil.class);
private DateUtil() {
throw new IllegalStateException("Utility class");
}
/**
* 获取当前日期,指定格式
* 描述:<描述函数实现的功能>.
*
* @return
*/
public static String nowDate() {
return nowDate(Constants.DATE_FORMAT_NUM);
}
/**
* 获取当前年,指定格式
* 描述:<描述函数实现的功能>.
*
* @return
*/
public static String nowYear() {
Calendar cal = Calendar.getInstance();
return cal.get(Calendar.YEAR) + "";
}
/**
* 获取上一年,指定格式
* 描述:<描述函数实现的功能>.
*
* @return
*/
public static String lastYear() {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.YEAR, -1);
return cal.get(Calendar.YEAR) + "";
}
/**
* 获取当前日期,指定格式
* 描述:<描述函数实现的功能>.
*
* @return
*/
public static Date nowDateTime() {
return strToDate(nowDateTimeStr(), Constants.DATE_FORMAT);
}
/**
* 获取当前日期,指定格式
* 描述:<描述函数实现的功能>.
*
* @return
*/
public static String nowDateTimeStr() {
return nowDate(Constants.DATE_FORMAT);
}
/**
* 获取当前日期,指定格式
* 描述:<描述函数实现的功能>.
*
* @return
*/
public static String nowDate(String DATE_FORMAT) {
SimpleDateFormat dft = new SimpleDateFormat(DATE_FORMAT);
return dft.format(new Date());
}
/**
* 获取当前日期,指定格式
* 描述:<描述函数实现的功能>.
*
* @return
*/
public static String nowDateTime(String DATE_FORMAT) {
SimpleDateFormat dft = new SimpleDateFormat(DATE_FORMAT);
return dft.format(new Date());
}
/**
* 获取当前日期,指定格式
* 描述:<描述函数实现的功能>.
*
* @return
*/
public static Integer getNowTime() {
long t = (System.currentTimeMillis()/1000L);
return Integer.parseInt(String.valueOf(t));
}
/**
* 获取当前时间戳(秒级)
* @return
*/
public static Long getTime() {
return (System.currentTimeMillis()/1000L);
}
/**
* 获取当前日期,指定格式
* 描述:<描述函数实现的功能>.
*
* @return
*/
public static Date nowDateTimeReturnDate(String DATE_FORMAT) {
SimpleDateFormat dft = new SimpleDateFormat(DATE_FORMAT);
return strToDate(dft.format(new Date()), DATE_FORMAT);
}
/**
* convert a date to string in a specifies fromat.
*
* @param date
* @param DATE_FORMAT
* @return
*/
public static String dateToStr(Date date, String DATE_FORMAT) {
if (date == null) {
return null;
}
SimpleDateFormat myFormat = new SimpleDateFormat(DATE_FORMAT);
return myFormat.format(date);
}
/**
* parse a String to Date in a specifies fromat.
*
* @param dateStr
* @param DATE_FORMAT
* @return
* @throws ParseException
*/
public static Date strToDate(String dateStr, String DATE_FORMAT) {
SimpleDateFormat myFormat = new SimpleDateFormat(DATE_FORMAT);
try {
return myFormat.parse(dateStr);
} catch (ParseException e) {
return null;
}
}
/**
* date add Second
*
* @param date
* @param num
* @return
*/
public static Date addSecond(Date date, int num) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.SECOND, num);
return calendar.getTime();
}
/**
* date add Second return String
*
* @param date
* @param num
* @return
*/
public static String addSecond(Date date, int num, String DATE_FORMAT) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.SECOND, num);
return dateToStr(calendar.getTime(), DATE_FORMAT);
}
/**
* 指定日期加上天数后的日期
*
* @param num 为增加的天数
* @param newDate 创建时间
* @return
*/
public static final String addDay(String newDate, int num, String pattern) {
SimpleDateFormat format = new SimpleDateFormat(pattern);
try {
Date currdate = format.parse(newDate);
Calendar ca = Calendar.getInstance();
ca.setTime(currdate);
ca.add(Calendar.DATE, num);
return format.format(ca.getTime());
} catch (ParseException e) {
LOGGER.error("转化时间出错,", e);
return null;
}
}
/**
* 指定日期加上天数后的日期
*
* @param num 为增加的天数
* @param newDate 创建时间
* @return
*/
public static final String addDay(Date newDate, int num, String pattern) {
SimpleDateFormat format = new SimpleDateFormat(pattern);
Calendar ca = Calendar.getInstance();
ca.setTime(newDate);
ca.add(Calendar.DATE, num);
return format.format(ca.getTime());
}
/**
* convert long to date
*
* @param date 待转换时间戳
* @return 转换后时间
*/
public static Date timeStamp11ToDate(Integer date) {
return new Date(date);
}
/**
* convert long to date string
*
* @param date 待转换时间戳
* @param DATE_FORMAT 格式化时间
* @return 格式化后的时间
*/
public static String timeStamp11ToDate(Integer date, String DATE_FORMAT) {
return dateToStr(new Date(date), DATE_FORMAT);
}
/**
* compare two date String with a pattern
*
* @param date1
* @param date2
* @param pattern
* @return
*/
public static int compareDate(String date1, String date2, String pattern) {
SimpleDateFormat DATE_FORMAT = new SimpleDateFormat(pattern);
try {
Date dt1 = DATE_FORMAT.parse(date1);
Date dt2 = DATE_FORMAT.parse(date2);
if (dt1.getTime() > dt2.getTime()) {
return 1;
} else if (dt1.getTime() < dt2.getTime()) {
return -1;
} else {
return 0;
}
} catch (ParseException e) {
e.printStackTrace();
return 0;
}
}
/**
* 检查日期格式是否合法
* @param date
* @param style
* @return
*/
public static boolean checkDateFormat(String date, String style) {
SimpleDateFormat DATE_FORMAT = new SimpleDateFormat(style);
try {
// 设置lenient为false.
// 否则SimpleDateFormat会比较宽松地验证日期,比如2007/02/29会被接受,并转换成2007/03/01
DATE_FORMAT.setLenient(false);
DATE_FORMAT.parse(date);
return true;
} catch (ParseException e) {
return false;
}
}
/**
* 计算两个时间之间的天数差
* @param beforeDay 开始时间
* @param afterDay 结束时间
* @return 相差天数
*/
public static long getTwoDateDays(Date beforeDay, Date afterDay) {
SimpleDateFormat sm = new SimpleDateFormat(Constants.DATE_FORMAT_NUM);
long days = -1;
try {
days = (sm.parse(sm.format(afterDay)).getTime() - sm.parse(sm.format(beforeDay)).getTime()) / (1000 * 3600 * 24);
} catch (Exception e) {
e.printStackTrace();
}
return days;
}
//获取时间戳11位
public static int getSecondTimestamp(Date date){
if (null == date) {
return 0;
}
String timestamp = String.valueOf(date.getTime()/1000);
return Integer.parseInt(timestamp);
}
//获取时间戳11位
public static int getSecondTimestamp(String date){
if (null == date) {
return 0;
}
Date date1 = strToDate(date, Constants.DATE_FORMAT);
if(date1 == null){
return 0;
}
String timestamp = String.valueOf(date1.getTime()/1000);
return Integer.parseInt(timestamp);
}
//获取时间戳10位
public static int getSecondTimestamp(Long timeMillis){
if (null == timeMillis) {
return 0;
}
String timestamp = String.valueOf(timeMillis / 1000);
return Integer.parseInt(timestamp);
}
//获取时间戳11位
public static int getSecondTimestamp(){
Date date = strToDate(nowDateTime(Constants.DATE_FORMAT), Constants.DATE_FORMAT);
if (null == date) {
return 0;
}
String timestamp = String.valueOf(date.getTime()/1000);
return Integer.parseInt(timestamp);
}
/** 获得昨天日期:yyyy-MM-dd HH:mm:ss */
public static String getYesterdayStr() {
Calendar c = Calendar.getInstance();
c.add(Calendar.DATE, -1);
SimpleDateFormat startSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return startSdf.format(c.getTime());
}
/** 获得本周第一天:yyyy-MM-dd HH:mm:ss */
public static String getWeekStartDay() {
Calendar c = Calendar.getInstance();
c.add(Calendar.WEEK_OF_MONTH, 0);
c.set(Calendar.DAY_OF_WEEK, 2);
SimpleDateFormat startSdf = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
return startSdf.format(c.getTime());
}
/** 获得本周最后一天:yyyy-MM-dd HH:mm:ss */
public static String getWeekEndDay() {
return addDay(getWeekStartDay(), 7, Constants.DATE_FORMAT);
}
/** 获得上周第一天:yyyy-MM-dd HH:mm:ss */
public static String getLastWeekStartDay() {
return addDay(getWeekStartDay(), -7, Constants.DATE_FORMAT);
}
/** 获得上周最后一天:yyyy-MM-dd HH:mm:ss */
public static String getLastWeekEndDay() {
return addDay(getLastWeekStartDay(), 7, Constants.DATE_FORMAT);
}
/** 获得本月最后一天:yyyy-MM-dd HH:mm:ss */
public static String getMonthEndDay() {
Calendar c = Calendar.getInstance();
c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));
SimpleDateFormat endSdf = new SimpleDateFormat("yyyy-MM-dd 23:59:59");
return endSdf.format(c.getTime());
}
/** 获得上月第一天:yyyy-MM-dd HH:mm:ss */
public static String getLastMonthStartDay() {
Calendar c = Calendar.getInstance();
c.add(Calendar.MONTH, -1);
c.set(Calendar.DAY_OF_MONTH, 1);
SimpleDateFormat startSdf = new SimpleDateFormat("yyyy-MM-01 00:00:00");
return startSdf.format(c.getTime());
}
/** 获得上月最后一天:yyyy-MM-dd HH:mm:ss */
public static String getLastMonthEndDay() {
Calendar c = Calendar.getInstance();
c.add(Calendar.MONTH, -1);
c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));
SimpleDateFormat endSdf = new SimpleDateFormat("yyyy-MM-dd 23:59:59");
return endSdf.format(c.getTime());
}
/** 获得上年第一天:yyyy-MM-dd HH:mm:ss */
public static String getLastYearStartDay() {
Calendar c = Calendar.getInstance();
c.add(Calendar.YEAR, -1);
SimpleDateFormat startSdf = new SimpleDateFormat("yyyy-01-01 00:00:00");
return startSdf.format(c.getTime());
}
/** 获得上年最后一天:yyyy-MM-dd HH:mm:ss */
public static String getLastYearEndDay() {
Calendar c = Calendar.getInstance();
c.add(Calendar.YEAR, -1);
SimpleDateFormat endSdf = new SimpleDateFormat("yyyy-12-31 23:59:59");
return endSdf.format(c.getTime());
}
/**
* 计算时间范围
* @param data string 类型
* @author Mr.Zhang
* @since 2020-05-06
* @return dateLimitUtilVo
*/
public static dateLimitUtilVo getDateLimit(String data){
//时间计算
String startTime = null;
String endTime = DateUtil.nowDateTime(Constants.DATE_FORMAT);
String day = DateUtil.nowDateTime(Constants.DATE_FORMAT_START);
String end = DateUtil.nowDateTime(Constants.DATE_FORMAT_END);
if(!StringUtils.isBlank(data)){
switch (data){
case Constants.SEARCH_DATE_DAY:
startTime = day;
break;
case Constants.SEARCH_DATE_YESTERDAY:
startTime = DateUtil.addDay(day, -1, Constants.DATE_FORMAT_START);
endTime = DateUtil.addDay(end, -1, Constants.DATE_FORMAT_END);
break;
case Constants.SEARCH_DATE_LATELY_7:
startTime = DateUtil.addDay(day, -6, Constants.DATE_FORMAT_START);
break;
case Constants.SEARCH_DATE_WEEK:
startTime = getWeekStartDay();
endTime = getWeekEndDay();
break;
case Constants.SEARCH_DATE_PRE_WEEK:
startTime = getLastWeekStartDay();
endTime = getLastWeekEndDay();
break;
case Constants.SEARCH_DATE_LATELY_30:
startTime = DateUtil.addDay(day, -30, Constants.DATE_FORMAT_START);
break;
case Constants.SEARCH_DATE_MONTH:
startTime = DateUtil.nowDateTime(Constants.DATE_FORMAT_MONTH_START);
endTime = getMonthEndDay();
break;
case Constants.SEARCH_DATE_PRE_MONTH:
startTime = getLastMonthStartDay();
endTime = getLastMonthEndDay();
break;
case Constants.SEARCH_DATE_YEAR:
startTime = DateUtil.nowDateTime(Constants.DATE_FORMAT_YEAR_START);
endTime = DateUtil.nowDateTime(Constants.DATE_FORMAT_YEAR_END);
break;
case Constants.SEARCH_DATE_PRE_YEAR:
startTime = getLastYearStartDay();
endTime = getLastYearEndDay();
break;
default:
List list = CxmallUtil.stringToArrayStr(data);
if(list.size() == 1){
throw new CxmallException("选择时间参数格式错误,请在 " +
Constants.SEARCH_DATE_DAY + "|" +
Constants.SEARCH_DATE_YESTERDAY + "|" +
Constants.SEARCH_DATE_LATELY_7 + "|" +
Constants.SEARCH_DATE_LATELY_30 + "|" +
Constants.SEARCH_DATE_MONTH + "|" +
Constants.SEARCH_DATE_YEAR + "|自定义时间范围(格式:yyyy-MM-dd HH:mm:ss,两个时间范围用逗号分割)");
}
startTime = list.get(0);
endTime = list.get(1);
// if (startTime.equals(endTime)) {
startTime = DateUtil.appointedDayStrToFormatStr(startTime, Constants.DATE_FORMAT_DATE, Constants.DATE_FORMAT_START);
endTime = DateUtil.appointedDayStrToFormatStr(endTime, Constants.DATE_FORMAT_DATE, Constants.DATE_FORMAT_END);
// }
break;
}
}
return new dateLimitUtilVo(startTime, endTime);
}
/**
* 获取某一时间段内的时间集合
* @param data string 类型
* @author Mr.Zhang
* @since 2020-05-06
* @return List
*/
public static List getListDate(String data) {
//获取30天的开始结束日期
dateLimitUtilVo dateLimit = DateUtil.getDateLimit(data);
//定义日期集合
List date = new ArrayList<>();
//开始日期
Date startDate = DateUtil.strToDate(dateLimit.getStartTime(), Constants.DATE_FORMAT);
//结束日期
Date endDate = DateUtil.strToDate(dateLimit.getEndTime(), Constants.DATE_FORMAT);
while (endDate.after(startDate)){
date.add(DateUtil.dateToStr(startDate, Constants.DATE_FORMAT_DATE)); // 放入集合
startDate = DateUtil.strToDate(DateUtil.addDay(startDate, 1, Constants.DATE_FORMAT), Constants.DATE_FORMAT); //循环一次 加一天
}
return date;
}
/**
* 两个日期之前的相差天数
* @param starDate 开始日期
* @param endDate 结束日期
* @return 相差天数
*/
public static int daysBetween(Date starDate,Date endDate){
Calendar cal = Calendar.getInstance();
cal.setTime(starDate);
long time1 = cal.getTimeInMillis();
cal.setTime(endDate);
long time2 = cal.getTimeInMillis();
long between_days=(time2-time1)/(1000*3600*24);
return Integer.parseInt(String.valueOf(between_days));
}
/**
* 获取指定日期指定格式字符串
*
* @param dateStr
* @param DATE_FORMAT
* @return
* @throws ParseException
*/
public static String appointedDayStrToFormatStr(String dateStr, String STR_DATE_FORMAT, String DATE_FORMAT) {
Date date = DateUtil.strToDate(dateStr, STR_DATE_FORMAT);
return DateUtil.dateToStr(date, DATE_FORMAT);
}
/**
* 获取当前时间小时
* @return 当前时间小时 默认24小时
*/
public static int getCurrentHour(){
int hour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
return hour;
}
/**
* 13位时间戳转字符串
* @param timestamp
* @param dateFormat
* @return
*/
public static String timestamp2DateStr(Long timestamp, String dateFormat) {
if (ObjectUtil.isNull(timestamp)) {
return "";
}
if (StrUtil.isBlank(dateFormat)) {
dateFormat = Constants.DATE_FORMAT;
}
Date date = new Date(timestamp);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat);
return simpleDateFormat.format(date);
}
/**
* 字符串转13位时间戳
*/
public static Long dateStr2Timestamp(String dateStr, String type) {
DateTime parse = cn.hutool.core.date.DateUtil.parse(dateStr);
if (StrUtil.isNotBlank(type)) {
if (type.equals(Constants.DATE_TIME_TYPE_BEGIN)) {
parse = cn.hutool.core.date.DateUtil.beginOfDay(parse);
}
if (type.equals(Constants.DATE_TIME_TYPE_END)) {
parse = cn.hutool.core.date.DateUtil.endOfDay(parse);
}
}
return parse.getTime();
}
public static void main(String[] args) {
dateLimitUtilVo dateLimit = getDateLimit(Constants.SEARCH_DATE_LATELY_7);
System.out.println(dateLimit.getStartTime());
System.out.println(dateLimit.getEndTime());
}
}

