package com.iailab.framework.common.util.date; import cn.hutool.core.date.LocalDateTimeUtil; import org.joda.time.DateTime; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.*; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; /** * 时间工具类 * * @author iailab */ public class DateUtils { /** * 时区 - 默认 */ public static final String TIME_ZONE_DEFAULT = "GMT+8"; /** * 秒转换成毫秒 */ public static final long SECOND_MILLIS = 1000; public static final String FORMAT_YEAR_MONTH_DAY = "yyyy-MM-dd"; public static final String FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND = "yyyy-MM-dd HH:mm:ss"; /** * 日期格式化 日期格式为:yyyy-MM-dd * @param date 日期 * @return 返回yyyy-MM-dd格式日期 */ public static String format(Date date) { return format(date, FORMAT_YEAR_MONTH_DAY); } /** * 日期格式化 日期格式为:yyyy-MM-dd * @param date 日期 * @param pattern 格式,如:DateUtils.DATE_TIME_PATTERN * @return 返回yyyy-MM-dd格式日期 */ public static String format(Date date, String pattern) { if(date != null){ SimpleDateFormat df = new SimpleDateFormat(pattern); return df.format(date); } return null; } /** * 日期解析 * @param date 日期 * @param pattern 格式,如:DateUtils.DATE_TIME_PATTERN * @return 返回Date */ public static Date parse(String date, String pattern) { try { return new SimpleDateFormat(pattern).parse(date); } catch (ParseException e) { e.printStackTrace(); } return null; } /** * 将 LocalDateTime 转换成 Date * * @param date LocalDateTime * @return LocalDateTime */ public static Date of(LocalDateTime date) { if (date == null) { return null; } // 将此日期时间与时区相结合以创建 ZonedDateTime ZonedDateTime zonedDateTime = date.atZone(ZoneId.systemDefault()); // 本地时间线 LocalDateTime 到即时时间线 Instant 时间戳 Instant instant = zonedDateTime.toInstant(); // UTC时间(世界协调时间,UTC + 00:00)转北京(北京,UTC + 8:00)时间 return Date.from(instant); } /** * 将 Date 转换成 LocalDateTime * * @param date Date * @return LocalDateTime */ public static LocalDateTime of(Date date) { if (date == null) { return null; } // 转为时间戳 Instant instant = date.toInstant(); // UTC时间(世界协调时间,UTC + 00:00)转北京(北京,UTC + 8:00)时间 return LocalDateTime.ofInstant(instant, ZoneId.systemDefault()); } public static Date addTime(Duration duration) { return new Date(System.currentTimeMillis() + duration.toMillis()); } public static boolean isExpired(LocalDateTime time) { LocalDateTime now = LocalDateTime.now(); return now.isAfter(time); } /** * 创建指定时间 * * @param year 年 * @param mouth 月 * @param day 日 * @return 指定时间 */ public static Date buildTime(int year, int mouth, int day) { return buildTime(year, mouth, day, 0, 0, 0); } /** * 创建指定时间 * * @param year 年 * @param mouth 月 * @param day 日 * @param hour 小时 * @param minute 分钟 * @param second 秒 * @return 指定时间 */ public static Date buildTime(int year, int mouth, int day, int hour, int minute, int second) { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.YEAR, year); calendar.set(Calendar.MONTH, mouth - 1); calendar.set(Calendar.DAY_OF_MONTH, day); calendar.set(Calendar.HOUR_OF_DAY, hour); calendar.set(Calendar.MINUTE, minute); calendar.set(Calendar.SECOND, second); calendar.set(Calendar.MILLISECOND, 0); // 一般情况下,都是 0 毫秒 return calendar.getTime(); } public static Date max(Date a, Date b) { if (a == null) { return b; } if (b == null) { return a; } return a.compareTo(b) > 0 ? a : b; } public static LocalDateTime max(LocalDateTime a, LocalDateTime b) { if (a == null) { return b; } if (b == null) { return a; } return a.isAfter(b) ? a : b; } /** * 是否今天 * * @param date 日期 * @return 是否 */ public static boolean isToday(LocalDateTime date) { return LocalDateTimeUtil.isSameDay(date, LocalDateTime.now()); } /** * 是否昨天 * * @param date 日期 * @return 是否 */ public static boolean isYesterday(LocalDateTime date) { return LocalDateTimeUtil.isSameDay(date, LocalDateTime.now().minusDays(1)); } public static List getTimeScale(Date startDate, Date endDate, int seconds) { List days = new ArrayList(); Calendar calendar = Calendar.getInstance(); calendar.setTime(startDate); while (calendar.getTime().compareTo(endDate) <= 0) { days.add(DateUtils.format(calendar.getTime(), FORMAT_YEAR_MONTH_DAY)); calendar.add(Calendar.SECOND, seconds); } return days; } /** * 对日期的【秒】进行加/减 * * @param date 日期 * @param seconds 秒数,负数为减 * @return 加/减几秒后的日期 */ public static Date addDateSeconds(Date date, int seconds) { DateTime dateTime = new DateTime(date); return dateTime.plusSeconds(seconds).toDate(); } /** * 对日期的【分钟】进行加/减 * * @param date 日期 * @param minutes 分钟数,负数为减 * @return 加/减几分钟后的日期 */ public static Date addDateMinutes(Date date, int minutes) { DateTime dateTime = new DateTime(date); return dateTime.plusMinutes(minutes).toDate(); } /** * 对日期的【小时】进行加/减 * * @param date 日期 * @param hours 小时数,负数为减 * @return 加/减几小时后的日期 */ public static Date addDateHours(Date date, int hours) { DateTime dateTime = new DateTime(date); return dateTime.plusHours(hours).toDate(); } /** * 对日期的【天】进行加/减 * * @param date 日期 * @param days 天数,负数为减 * @return 加/减几天后的日期 */ public static Date addDateDays(Date date, int days) { DateTime dateTime = new DateTime(date); return dateTime.plusDays(days).toDate(); } /** * 对日期的【周】进行加/减 * * @param date 日期 * @param weeks 周数,负数为减 * @return 加/减几周后的日期 */ public static Date addDateWeeks(Date date, int weeks) { DateTime dateTime = new DateTime(date); return dateTime.plusWeeks(weeks).toDate(); } /** * 对日期的【月】进行加/减 * * @param date 日期 * @param months 月数,负数为减 * @return 加/减几月后的日期 */ public static Date addDateMonths(Date date, int months) { DateTime dateTime = new DateTime(date); return dateTime.plusMonths(months).toDate(); } /** * 对日期的【年】进行加/减 * * @param date 日期 * @param years 年数,负数为减 * @return 加/减几年后的日期 */ public static Date addDateYears(Date date, int years) { DateTime dateTime = new DateTime(date); return dateTime.plusYears(years).toDate(); } }