import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import java.lang.management.ManagementFactory;
import java.security.SecureRandom;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.util.*;
/**
* 时间工具类
*
* @author GZQ
*/
@Slf4j
public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
public static String YYYY = "yyyy";
public static String YYYY_MM = "yyyy-MM";
public static String YYYY_MM_DD = "yyyy-MM-dd";
public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
static SimpleDateFormat etcFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private static String[] parsePatterns = {"yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM-dd", "yyyy-MM", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM/dd", "yyyy/MM", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM.dd", "yyyy.MM"};
/**
* 获取当前Date型日期
*
* @return Date() 当前日期
*/
public static Date getNowDate() {
return new Date();
}
/**
* 获取当前日期, 默认格式为yyyy-MM-dd
*
* @return String
*/
public static String getDate() {
return dateTimeNow(YYYY_MM_DD);
}
public static final String getTime() {
return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
}
public static final String dateTimeNow() {
return dateTimeNow(YYYYMMDDHHMMSS);
}
public static final String dateTimeNow(final String format) {
return parseDateToStr(format, new Date());
}
public static final String dateTime(final Date date) {
return parseDateToStr(YYYY_MM_DD, date);
}
public static final String format_yyyy_MM_dd_HH_mm_ss(final Date date) {
return parseDateToStr(YYYY_MM_DD_HH_MM_SS, date);
}
public static final String format_yyyy_MM_dd_HH_mm_ss(final long date) {
return parseDateToStr(YYYY_MM_DD_HH_MM_SS, new Date(date));
}
public static final String dateTime(final Date date, final String format) {
return parseDateToStr(format, date);
}
public static final String parseDateToStr(final String format, final Date date) {
return new SimpleDateFormat(format).format(date);
}
public static final Date dateTime(final String format, final String source) {
try {
return new SimpleDateFormat(format).parse(source);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
/**
* 日期路径 即年/月/日 如2018/08/08
*/
public static final String datePath() {
Date now = new Date();
return DateFormatUtils.format(now, "yyyy/MM/dd");
}
/**
* 日期路径 即年/月/日 如20180808
*/
public static final String dateTime() {
Date now = new Date();
return DateFormatUtils.format(now, "yyyyMMdd");
}
/**
* 日期型字符串转化为日期 格式
*/
public static Date parseDate(Object str) {
if (str == null) {
return null;
}
try {
return parseDate(str.toString(), parsePatterns);
} catch (ParseException e) {
return null;
}
}
/**
* 获取服务器启动时间
*/
public static Date getServerStartDate() {
long time = ManagementFactory.getRuntimeMXBean().getStartTime();
return new Date(time);
}
/**
* 计算两个时间差
*/
public static String getDatePoor(Date endDate, Date nowDate) {
long nd = 1000 * 24 * 60 * 60;
long nh = 1000 * 60 * 60;
long nm = 1000 * 60;
// long ns = 1000;
// 获得两个时间的毫秒时间差异
long diff = endDate.getTime() - nowDate.getTime();
// 计算差多少天
long day = diff / nd;
// 计算差多少小时
long hour = diff % nd / nh;
// 计算差多少分钟
long min = diff % nd % nh / nm;
// 计算差多少秒//输出结果
// long sec = diff % nd % nh % nm / ns;
return day + "天" + hour + "小时" + min + "分钟";
}
/**
* 增加 LocalDateTime ==> Date
*/
public static Date toDate(LocalDateTime temporalAccessor) {
ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault());
return Date.from(zdt.toInstant());
}
/**
* 增加 LocalDate ==> Date
*/
public static Date toDate(LocalDate temporalAccessor) {
LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0));
ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());
return Date.from(zdt.toInstant());
}
public static String getHour(String dateStr) {
DateTime parse = DateUtil.parse(dateStr);
return DateUtil.format(parse, "HH:00:00");
}
public static String getDay(String dateStr) {
DateTime parse = DateUtil.parse(dateStr);
return DatePattern.NORM_DATE_FORMAT.format(parse);
}
public static String getMonth(String dateStr) {
DateTime parse = DateUtil.parse(dateStr);
return DatePattern.NORM_MONTH_FORMAT.format(parse);
}
public static String getYear(String dateStr) {
DateTime parse = DateUtil.parse(dateStr);
return String.valueOf(DateUtil.year(parse));
}
public static void main(String[] args) {
// String hour = DateUtils.getHour("2022-09-01 01:29:00");
// System.out.println(hour);
String randomDateTimeStr = DateUtils.getRandomDateTimeStr("2023-02-01 00:00:00", "2023-12-01 00:00:00");
System.out.println(randomDateTimeStr);
}
public static String convertFileDate() {
Date now = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String sdf = format.format(now);
return sdf.substring(0, 4) + "." + sdf.substring(5, 7) + "." + sdf.substring(8, 10);
}
public static String convertTitleDate() {
Date now = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String sdf = format.format(now);
return sdf.substring(0, 4) + "." + sdf.substring(5, 7) + "." + sdf.substring(8, 10) + " 00:00-" + sdf.substring(11, 16);
}
public static Integer queryHour() {
Date now = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String sdf = format.format(now);
String substring = sdf.substring(11, 13);
return Integer.parseInt(substring);
}
/**
* 开始时间加1天
*/
public static String addDateDay(String startTime) {
// 自动感应格式
Date date = DateUtil.parse(startTime);
// 日期时间偏移
DateTime dateTime = DateUtil.offsetDay(date, 1);
return DateUtil.format(dateTime, "yyyy-MM-dd");
}
public static int getDaysOfMonth(String mouth) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
try {
Date parse = sdf.parse(mouth);
Calendar calendar = Calendar.getInstance();
calendar.setTime(parse);
return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
/**
* <code>
* liuzc
* n年后的时间
* </code>
*
* @return
*/
public static final String nyearsLater(final String now, final int n) {
if (now == null) {
throw new RuntimeException("参数错误");
}
Calendar calendar = Calendar.getInstance();
Date nowDate = DateUtil.parse(now);
if (nowDate == null) {
throw new RuntimeException("parse失败2");
}
calendar.setTime(nowDate);
calendar.add(Calendar.YEAR, n);
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime());
}
/**
* <code>
* liuzc
* n天后的时间
* </code>
*
* @return
*/
public static final String ndaysLater(final String now, final int n) {
if (now == null) {
throw new RuntimeException("参数错误");
}
Calendar calendar = Calendar.getInstance();
Date nowDate = DateUtil.parse(now);
if (nowDate == null) {
throw new RuntimeException("parse失败3");
}
calendar.setTime(nowDate);
calendar.add(Calendar.DAY_OF_MONTH, n);
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime());
}
/**
* <code>
* liuzc
* n天后的时间
* </code>
*
* @return
*/
public static final Date ndaysLater(final Date now, final int n) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(now);
calendar.add(Calendar.DAY_OF_MONTH, n);
return calendar.getTime();
}
/**
* @return
*/
public static final Date nhoursLater(final Date now, final int n) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(now);
calendar.add(Calendar.HOUR, n);
return calendar.getTime();
}
/**
* @return
*/
public static final Date nminutesLater(final Date now, final int n) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(now);
calendar.add(Calendar.MINUTE, n);
return calendar.getTime();
}
/**
* <code>
* liuzc
* n天后的时间
* </code>
*
* @return
*/
public static final Date nsecondsLater(final Date now, final int n) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(now);
calendar.add(Calendar.SECOND, n);
return calendar.getTime();
}
/**
* <code>
* liuzc
* 间隔几天
* </code>
*
* @return
*/
public static final int daysInterval(final String begin, final String end) {
Calendar calendar = Calendar.getInstance();
Date beginDate = null;
Date endDate = null;
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
beginDate = sdf.parse(begin);
endDate = sdf.parse(end);
} catch (Exception e) {
throw new RuntimeException("parse失败");
}
if (beginDate == null || endDate == null) {
throw new RuntimeException("parse失败");
}
calendar.setTime(beginDate);
long begin1 = calendar.getTimeInMillis();
calendar.setTime(endDate);
long end1 = calendar.getTimeInMillis();
long days = (end1 - begin1) / (1000 * 3600 * 24);
return Long.valueOf(days).intValue();
}
/**
* <code>
* liuzc
* 间隔几分钟
* </code>
*
* @return
*/
public static final int minutesInterval(final Date begin, final Date end) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(begin);
long begin1 = calendar.getTimeInMillis();
calendar.setTime(end);
long end1 = calendar.getTimeInMillis();
long minutes = (end1 - begin1) / (1000 * 60);
return Long.valueOf(minutes).intValue();
}
public static String getDateYYYYMMDDStr(String date) {
try {
// DateUtils.parseDateToStr(YYYY_MM_DD_HH_MM_SS,new
// SimpleDateFormat(YYYY_MM_DD_HH_MM_SS).parse(date));
return DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, new SimpleDateFormat(DateUtils.YYYY_MM_DD).parse(date));
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
public static boolean isEffectiveDate(Date nowTime, Date startTime, Date endTime) {
if (nowTime.getTime() == startTime.getTime() || nowTime.getTime() == endTime.getTime()) {
return true;
}
Calendar date = Calendar.getInstance();
date.setTime(nowTime);
Calendar begin = Calendar.getInstance();
begin.setTime(startTime);
Calendar end = Calendar.getInstance();
end.setTime(endTime);
return date.after(begin) && date.before(end);
}
public static boolean isEffectiveDate(String nowTime, String startTime, String endTime) {
if (StringUtils.isBlank(nowTime) || StringUtils.isBlank(startTime) || StringUtils.isBlank(endTime)) {
return false;
}
Date nowDate = parseDate(nowTime);
Date startDate = parseDate(startTime);
Date endDate = parseDate(endTime);
return isEffectiveDate(nowDate, startDate, endDate);
}
public static String etcTodayStartTime() {
return etcFormat.format(DateUtil.beginOfDay(new Date()));
}
public static String etcTodayEndTime() {
return etcFormat.format(DateUtil.date());
}
public static String todayStartTime() {
return format.format(DateUtil.beginOfDay(new Date()));
}
public static String todayEndTime() {
return format.format(DateUtil.date());
}
public static Date parseDateShanghai(final String str, final String parsePattern) throws ParseException {
if (str == null || parsePatterns == null) {
throw new IllegalArgumentException("Date and Patterns must not be null");
}
final TimeZone tz = TimeZone.getTimeZone("GMT+8:00");
final Locale lcl = Locale.CHINA;
final Calendar calendar = Calendar.getInstance(tz, lcl);
calendar.setLenient(false);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(parsePattern);
simpleDateFormat.setCalendar(calendar);
simpleDateFormat.setTimeZone(tz);
return simpleDateFormat.parse(str);
}
public static Date parseDateShanghai(final String str) {
if (str == null || parsePatterns == null) {
throw new IllegalArgumentException("Date and Patterns must not be null");
}
final TimeZone tz = TimeZone.getTimeZone("GMT+8:00");
final Locale lcl = Locale.CHINA;
final Calendar calendar = Calendar.getInstance(tz, lcl);
calendar.setLenient(false);
Date ret = null;
for (String p : parsePatterns) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(p);
simpleDateFormat.setCalendar(calendar);
simpleDateFormat.setTimeZone(tz);
try {
ret = simpleDateFormat.parse(str);
break;
} catch (ParseException e) {
}
}
return ret;
}
public static final ThreadLocal<SimpleDateFormat> DATE_TIME_TL_FORMAT = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
public static String getRandomDateTimeStr(String startTime, String endTime) {
try {
SimpleDateFormat sdf = DATE_TIME_TL_FORMAT.get();
// 指定开始日期
long start = sdf.parse(startTime).getTime();
// 指定结束日期
long end = sdf.parse(endTime).getTime();
DATE_TIME_TL_FORMAT.remove();
// 调用方法产生随机数
long randomDate = nextLong(start, end);
// 格式化输出日期
String format = String.format("%1$tF %1$tT", randomDate);
return format;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static long nextLong(long start, long end) {
SecureRandom random = new SecureRandom();
return start + (long) (random.nextDouble() * (end - start + 1));
}
// 获取近七天日期
public static List<String> getSevenDate() {
List<String> dateList = new ArrayList<>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
for (int i = 0; i < 7; i++) {
Date date = DateUtils.addDays(new Date(), -i);
String formatDate = sdf.format(date);
dateList.add(formatDate);
}
return dateList;
}
public static Date dateToISODate(Date dateStr) {
Date parse = null;
try {
// 解析字符串时间
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
format.setCalendar(new GregorianCalendar(new SimpleTimeZone(0, "GMT")));
parse = format.parse(format.format(dateStr));
} catch (ParseException e) {
e.printStackTrace();
}
return parse;
}
/*** 如果是字符串需要先转成date 再调用 dateToISODate() 方法* @param strDate* @return */
public static Date strToDateLong(String strDate) {
Date strtodate = null;
try {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
strtodate = formatter.parse(strDate);
} catch (ParseException e) {
e.printStackTrace();
}
return strtodate;
}
}
java 时间工具类封装
最新推荐文章于 2024-07-12 16:26:30 发布