import lombok.extern.slf4j.Slf4j;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
public class DateUtil {
private static final SimpleDateFormat formatter = new SimpleDateFormat( "yyyyMMddHHmmss" );
/**
* 传入月份区间, 推算日期
*
* @param month 增加的月份数
* @return 日期格式 yyyyMMddHHmmss
*/
public static String dayCalculate(int month) {
Date date = new Date();
log.info("current date:[{}]", formatter.format(date));
Calendar calendar = Calendar.getInstance();
// 获取时区
TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai");
calendar.setTimeZone(tz);
calendar.setTime(date);
calendar.add(Calendar.MONTH, month);
String nowDate = formatter.format(calendar.getTime());
log.info("now date:[{}]", nowDate);
return nowDate;
}
/**
* 根据开始时间和结束时间计算天数
* @param startTime 开始时间
* @param endTime 结束时间
* @return 天数
* @throws ParseException 解析异常
*/
public static int calculateTotalDays(String startTime, String endTime) throws ParseException{
Date date1 = null;
Date date = formatter.parse(startTime);
long ts = date.getTime();
date1 = formatter.parse(endTime);
long ts1 = date1.getTime();
long ts2 = ts1-ts;
int totalDays = 0;
totalDays = (int) (ts2/(24*3600*1000)+1);
return totalDays;
}
/**
* 日期转换成字符串
* @param date 日期
* @return yyyyMMddHHmmss格式的日期
* @throws ParseException 异常
*/
public static String dateToStr(Date date) throws ParseException {
return formatter.format(date);
}
/**
* 时间日期转换
* @param strDate 字符串yyyyMMddHHmmss
* @return 字符串yyyy-MM-dd HH:mm:ss
*/
public static String strToDateLong(String strDate) throws ParseException {
Date date = new SimpleDateFormat("yyyyMMddHHmmss").parse(strDate);
//再将时间转换为对应格式字符串
return new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(date);
}
/**
* 时间日期转换
* @param strDate 字符串yyyyMMddHHmmss
* @return date
*/
public static Date strToDate(String strDate) {
//1.使用atZone()方法将LocalDateTime转换为ZonedDateTime
//2.将ZonedDateTime转换为Instant,并从中获取Date
Date date = null;
try {
LocalDateTime fromDate = LocalDateTime.parse(strDate, DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
// 获取时区
TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai");
ZoneId zoneId = tz.toZoneId();
// 设置时区
ZonedDateTime zdt = fromDate.atZone(zoneId);
date = Date.from(zdt.toInstant());
} catch (Exception e) {
log.error(e.getMessage());
return null;
}
return date;
}
}