com.zyy.common.util.DateUtils Maven / Gradle / Ivy
package com.zyy.common.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Calendar;
import java.util.Date;
/**
* 日期工具类
*
* @author li.yang
*/
public class DateUtils {
//
public static final String DATE_PATTERN = "yyyy-MM-dd";
public static final String HOUR_PATTERN = "yyyy-MM-dd HH";
public static final String MINUTES_PATTERN = "yyyy-MM-dd HH:mm";
public static final String TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
public static String format(Date date, String pattern) {
SimpleDateFormat format = new SimpleDateFormat(pattern);
return format.format(date);
}
public static String format(Date date) {
return format(date, DATE_PATTERN);
}
public static Date parse(String str, String pattern) throws ParseException {
SimpleDateFormat format = new SimpleDateFormat(pattern);
return format.parse(str);
}
public static Date parse(String str) throws ParseException {
return parse(str, DATE_PATTERN);
}
public static Date parse(Date date) throws ParseException {
return parse(format(date));
}
public static Date parse(Date date, String pattern) throws ParseException {
return parse(format(date, pattern), pattern);
}
/**
* 获取两个时间的最大值
*
* @param d1 时间
* @param d2 时间
* @return 最大时间
*/
public static Date getMaxDate(Date d1, Date d2) {
if (d1 == null) return d2;
if (d2 == null) return d1;
if (d1.after(d2)) return d1;
else return d2;
}
/**
* 获取两个时间的最小值
*
* @param d1 时间
* @param d2 时间
* @return 最小时间
*/
public static Date getMinDate(Date d1, Date d2) {
if (d1 == null) return d2;
if (d2 == null) return d1;
if (d1.before(d2)) return d1;
else return d2;
}
/**
* 计算两个时间差
*
* @param d1 第一个时间
* @param d2 第二个时间
* @return 计算结果Duration
*/
public static Duration between(Date d1, Date d2) {
LocalDateTime begin = d1.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
LocalDateTime end = d2.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
return Duration.between(begin, end);
}
/**
* 判断一个时间是否在两个时间之间
*
* @return boolean
*/
public static boolean isBetween(Date begin, Date end, Date target) {
return begin.compareTo(target) <= 0 && end.compareTo(target) >= 0;
}
/**
* 计算两个时间差
*
* @param d1 第一个时间
* @param d2 第二个时间
* @return 计算结果(天)
*/
public static long betweenDay(Date d1, Date d2) {
LocalDateTime begin = d1.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
LocalDateTime end = d2.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
return Duration.between(begin, end).toDays();
}
/**
* 计算两个时间差
*
* @param d1 第一个时间
* @param d2 第二个时间
* @return 计算结果(小时)
*/
public static long betweenHours(Date d1, Date d2) {
LocalDateTime begin = d1.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
LocalDateTime end = d2.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
return Duration.between(begin, end).toHours();
}
/**
* 获取两个日期相差的月数,精确到日
*
* @param d1 第一个时间
* @param d2 第二个时间
* @return ['月','日']
*/
public static long[] betweenMonth(Date d1, Date d2) {
Calendar start = Calendar.getInstance();
start.setTime(d1);
Calendar end = Calendar.getInstance();
end.setTime(d2);
int startDay = start.get(Calendar.DATE);
int startMonth = start.get(Calendar.MONTH);
end.add(Calendar.DATE, 1);
int endDay = end.get(Calendar.DATE);
int suf = endDay - startDay;
if (suf == 0) {
return new long[]{(end.get(Calendar.YEAR) - start.get(Calendar.YEAR)) * 12 + end.get(Calendar.MONTH) - startMonth, 0};
} else if (suf < 0) {
end.set(Calendar.DATE, 0);
return new long[]{(end.get(Calendar.YEAR) - start.get(Calendar.YEAR)) * 12 + end.get(Calendar.MONTH) - startMonth, end.get(Calendar.DATE) + suf};
} else {
return new long[]{(end.get(Calendar.YEAR) - start.get(Calendar.YEAR)) * 12 + end.get(Calendar.MONTH) - startMonth, suf};
}
}
/**
* 计算两个时间差
*
* @param d1 第一个时间
* @return 计算结果(小时)
*/
public static LocalDateTime toLocalDateTime(Date d1) {
return d1.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
}
}