package com.zhongshu.card.client.utils; import com.zhongshu.card.client.type.device.WeekDayType; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.*; import java.time.format.DateTimeFormatter; import java.time.temporal.IsoFields; import java.time.temporal.WeekFields; import java.util.*; @Slf4j public class DateUtils { public final static String FORMAT_LONG = "yyyy-MM-dd HH:mm:ss"; public final static String pattern = "yyyy-MM-dd"; /** * yyyyMMdd */ public final static String pattern1 = "yyyyMMdd"; public final static String patternyyyyMMDD = "yyyyMMdd"; public final static String patternyyyyMMddHHmmssSSS = "yyyyMMddHHmmssSSS"; public final static String patternStr = "yyyy年MM月dd日"; public final static String patternyyyyMM = "yyyy-MM"; public final static String patternyyyyM = "yyyy-M"; public final static String patternHHmm = "HH:mm"; public final static String patternyyyyMis = "yyyy-MM-dd HH:mm"; public final static String patternyyyySSS = "yyyy-MM-dd HH:mm:ss SSS"; public final static String patternyyyy = "yyyy"; public final static String patternMM = "MM"; public final static String patternWx = "yyyy-MM-dd'T'HH:mm:ssXXX"; public final static String unionAuth = "yyyyMMddHHmmss"; public final static String patternyyyyMMCn = "yyyy年MM月"; public static Long timeToLong(String time) { return timeToLong(time, FORMAT_LONG); } public static Long timeToLong(String time, String format) { if (!org.springframework.util.StringUtils.hasText(time)) { return null; } try { return new SimpleDateFormat(format).parse(time).getTime(); } catch (ParseException e) { e.printStackTrace(); } return null; } @SneakyThrows public static Double timeToDouble(String time, String format) { assert format != null; Long timestamp = null; if (StringUtils.isNotBlank(time)) { timestamp = new SimpleDateFormat(format).parse(time).getTime(); } if (timestamp != null) { return timestamp.doubleValue(); } return null; } public static String paresTime(Long time, String pattern) { if (time == null || time <= 0) { return ""; } Date date = new Date(time); SimpleDateFormat formatter = new SimpleDateFormat(pattern); return formatter.format(date); } /** * 获得本周的第一天,周一 * * @return */ public static Long getCurrentWeekDayStartTime() { Calendar c = Calendar.getInstance(); int weekday = c.get(Calendar.DAY_OF_WEEK) - 2; c.add(Calendar.DATE, -weekday); c.set(Calendar.HOUR_OF_DAY, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); return c.getTimeInMillis(); } /** * 获得上周的第一天,周一 * * @return */ public static Long getBeforeWeekDayStartTime() { Calendar c = Calendar.getInstance(); int weekday = c.get(Calendar.DAY_OF_WEEK) - 2 + 7; c.add(Calendar.DATE, -weekday); c.set(Calendar.HOUR_OF_DAY, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); return c.getTimeInMillis(); } /** * 获得上周的最后一天,周日 * * @return */ public static Long getBeforeWeekDayEndTime() { Calendar c = Calendar.getInstance(); int weekday = c.get(Calendar.DAY_OF_WEEK); c.add(Calendar.DATE, 8 - weekday - 7); c.set(Calendar.HOUR_OF_DAY, 23); c.set(Calendar.MINUTE, 59); c.set(Calendar.SECOND, 59); return c.getTimeInMillis(); } /** * 获得本周的最后一天,周日 * * @return */ public static Long getCurrentWeekDayEndTime() { Calendar c = Calendar.getInstance(); int weekday = c.get(Calendar.DAY_OF_WEEK); c.add(Calendar.DATE, 8 - weekday); c.set(Calendar.HOUR_OF_DAY, 23); c.set(Calendar.MINUTE, 59); c.set(Calendar.SECOND, 59); return c.getTimeInMillis(); } /** * 获得本天的开始时间 * * @return */ public static Date getCurrentDayStartTime() { ZoneId zoneId = ZoneId.systemDefault(); LocalDateTime date = LocalDateTime.now(); LocalDateTime startOfTheDay = LocalDateTime.of(date.toLocalDate(), LocalTime.MIN); Date beginTime = Date.from(startOfTheDay.atZone(zoneId).toInstant()); return beginTime; } /** * 获得本天的结束时间 * * @return */ public static Date getCurrentDayEndTime() { ZoneId zoneId = ZoneId.systemDefault(); LocalDateTime date = LocalDateTime.now(); LocalDateTime startOfTheDay = LocalDateTime.of(date.toLocalDate(), LocalTime.MAX); Date beginTime = Date.from(startOfTheDay.atZone(zoneId).toInstant()); return beginTime; } /** * 得到当前是本周第几天 * * @return */ public static int getCurrentWeekDay() { Calendar c = Calendar.getInstance(); int weekday = c.get(Calendar.DAY_OF_WEEK); return weekday - 1; } /** * 当前是今年第几周 * * @return */ public static int getCurrentWeekInYear() { LocalDate date = LocalDate.now(); // 获取当前日期 int weekOfYear = date.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR); return weekOfYear; } /** * 得到当前是第几月份,如:8 * * @return */ public static int getCurrentMonthInYear() { LocalDate date = LocalDate.now(); // 获取当前日期 return date.getMonthValue(); } /** * 得到当前年份,如:2024 * * @return */ public static int getCurrentYear() { LocalDate date = LocalDate.now(); // 获取当前日期 return date.getYear(); } /** * 在月份的第几天 * * @return */ public static int getCurrentDayInMonth() { LocalDate date = LocalDate.now(); return date.getDayOfMonth(); } /** * 在年的第几天 * * @return */ public static int getCurrentDayInYear() { LocalDate date = LocalDate.now(); return date.getDayOfYear(); } /** * 当前的第几小时 * * @return */ public static int getCurrentHourOfDay() { Calendar calendar = Calendar.getInstance(); return calendar.get(Calendar.HOUR_OF_DAY); } /** * 获得本小时的开始时间 * * @return */ public static Long getCurrentHourStartTime() { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); return calendar.getTimeInMillis(); } /** * 获得本小时的结束时间 * * @return */ public static Long getCurrentHourEndTime() { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.MINUTE, 59); calendar.set(Calendar.SECOND, 59); return calendar.getTimeInMillis(); } /** * 获得本月的开始时间 * * @return */ public static Long getCurrentMonthStartTime() { Calendar c = Calendar.getInstance(); c.set(Calendar.DATE, 1); c.set(Calendar.HOUR_OF_DAY, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); return c.getTimeInMillis(); } /** * 获得上个月的开始时间 * * @return */ public static Long getBeforeMonthStartTime() { Calendar c = Calendar.getInstance(); c.add(Calendar.MONTH, -1); c.set(Calendar.DATE, 1); c.set(Calendar.HOUR_OF_DAY, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); return c.getTimeInMillis(); } /** * 本月的结束时间 * * @return */ public static Long getCurrentMonthEndTime() { Calendar c = Calendar.getInstance(); c.set(Calendar.DATE, 1); c.add(Calendar.MONTH, 1); c.add(Calendar.DATE, -1); c.set(Calendar.HOUR_OF_DAY, 23); c.set(Calendar.MINUTE, 59); c.set(Calendar.SECOND, 59); return c.getTimeInMillis(); } public static Long getBeforeMonthEndTime() { Calendar c = Calendar.getInstance(); c.set(Calendar.DATE, 1); c.add(Calendar.DATE, -1); c.set(Calendar.HOUR_OF_DAY, 23); c.set(Calendar.MINUTE, 59); c.set(Calendar.SECOND, 59); return c.getTimeInMillis(); } /** * 当前年的开始时间 * * @return */ public static Long getCurrentYearStartTime() { Calendar c = Calendar.getInstance(); c.set(Calendar.MONTH, 0); c.set(Calendar.DATE, 1); c.set(Calendar.HOUR_OF_DAY, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); return c.getTimeInMillis(); } /** * 当前年的结束时间 * * @return */ public static Long getCurrentYearEndTime() { Calendar c = Calendar.getInstance(); Date now = null; c.set(Calendar.MONTH, 11); c.set(Calendar.DATE, 31); c.set(Calendar.HOUR_OF_DAY, 23); c.set(Calendar.MINUTE, 59); c.set(Calendar.SECOND, 59); return c.getTimeInMillis(); } /** * 当前季度的开始时间 * * @return */ public static Long getCurrentQuarterStartTime() { Calendar c = Calendar.getInstance(); int currentMonth = c.get(Calendar.MONTH) + 1; if (currentMonth >= 1 && currentMonth <= 3) c.set(Calendar.MONTH, 0); else if (currentMonth >= 4 && currentMonth <= 6) c.set(Calendar.MONTH, 3); else if (currentMonth >= 7 && currentMonth <= 9) c.set(Calendar.MONTH, 4); else if (currentMonth >= 10 && currentMonth <= 12) c.set(Calendar.MONTH, 9); c.set(Calendar.DATE, 1); c.set(Calendar.HOUR_OF_DAY, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); return c.getTimeInMillis(); } /** * 当前季度的结束时间 * * @return */ public static Long getCurrentQuarterEndTime() { Calendar c = Calendar.getInstance(); int currentMonth = c.get(Calendar.MONTH) + 1; Date now = null; try { if (currentMonth >= 1 && currentMonth <= 3) { c.set(Calendar.MONTH, 2); c.set(Calendar.DATE, 31); } else if (currentMonth >= 4 && currentMonth <= 6) { c.set(Calendar.MONTH, 5); c.set(Calendar.DATE, 30); } else if (currentMonth >= 7 && currentMonth <= 9) { c.set(Calendar.MONTH, 8); c.set(Calendar.DATE, 30); } else if (currentMonth >= 10 && currentMonth <= 12) { c.set(Calendar.MONTH, 11); c.set(Calendar.DATE, 31); } c.set(Calendar.HOUR_OF_DAY, 23); c.set(Calendar.MINUTE, 59); c.set(Calendar.SECOND, 59); } catch (Exception e) { e.printStackTrace(); } return now.getTime(); } /** * 获取前/后半年的开始时间 * * @return */ public static Long getHalfYearStartTime() { Calendar c = Calendar.getInstance(); int currentMonth = c.get(Calendar.MONTH) + 1; if (currentMonth >= 1 && currentMonth <= 6) { c.set(Calendar.MONTH, 0); } else if (currentMonth >= 7 && currentMonth <= 12) { c.set(Calendar.MONTH, 6); } c.set(Calendar.DATE, 1); c.set(Calendar.HOUR_OF_DAY, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); return c.getTimeInMillis(); } /** * 获取前/后半年的结束时间 * * @return */ public static Long getHalfYearEndTime() { Calendar c = Calendar.getInstance(); int currentMonth = c.get(Calendar.MONTH) + 1; if (currentMonth >= 1 && currentMonth <= 6) { c.set(Calendar.MONTH, 5); c.set(Calendar.DATE, 30); } else if (currentMonth >= 7 && currentMonth <= 12) { c.set(Calendar.MONTH, 11); c.set(Calendar.DATE, 31); } c.set(Calendar.HOUR_OF_DAY, 23); c.set(Calendar.MINUTE, 59); c.set(Calendar.SECOND, 59); return c.getTimeInMillis(); } public static Date parseStr2Date(String dateStr) { SimpleDateFormat longSdf = new SimpleDateFormat(FORMAT_LONG); try { return longSdf.parse(dateStr); } catch (Exception e) { e.printStackTrace(); } return null; } public static Date parseStr2Date(String dateStr, String format) { SimpleDateFormat longSdf = new SimpleDateFormat(format); try { if (StringUtils.isNotEmpty(dateStr)) { return longSdf.parse(dateStr); } } catch (Exception e) { e.printStackTrace(); } return null; } public static String getShort2Str(Date date) { if (date == null) { return null; } SimpleDateFormat shortSdf = new SimpleDateFormat(pattern); return shortSdf.format(date); } /** * 毫秒数转时间 * * @return */ public static String millsToDuration(long mills) { long dayBal = mills % (86400000); int days = Long.valueOf(mills / 86400000).intValue(); long hourBal = dayBal % (3600000); int hours = Long.valueOf(dayBal / (3600000)).intValue(); long minuteBal = hourBal % (60000); int minutes = Long.valueOf(hourBal / (60000)).intValue(); int seconds = Long.valueOf(Long.valueOf(minuteBal / 1000).intValue()).intValue(); String str = ""; if (days > 0) { str += days + "天"; } if (hours > 0) { str += hours + "小时"; } if (minutes > 0) { str += minutes + "分钟"; } if (seconds > 0) { str += seconds + "秒"; } return str; } public static Long getDayStartTime(Long timestamp) { ZoneId zoneId = ZoneId.systemDefault(); LocalDateTime date = LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), zoneId); LocalDateTime startOfTheDay = LocalDateTime.of(date.toLocalDate(), LocalTime.MIN); return Timestamp.valueOf(startOfTheDay).getTime(); } /** * 获得本天的结束时间 * * @return */ public static Long getDayEndTime(Long timestamp) { ZoneId zoneId = ZoneId.systemDefault(); LocalDateTime date = LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), zoneId); LocalDateTime endOfTheDay = LocalDateTime.of(date.toLocalDate(), LocalTime.MAX); return Timestamp.valueOf(endOfTheDay).getTime(); } /** * 获得时间在当年的周数 * * @return */ public static Integer getWeekOfYear(Long timestamp) { ZoneId zoneId = ZoneId.systemDefault(); LocalDateTime date = LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), zoneId); // WeekFields.ISO = 一星期从周一开始算, 其它的请自己摸索. WeekFields weekFields = WeekFields.ISO; int weekNumber = date.get(weekFields.weekOfWeekBasedYear()); return weekNumber; } public static Integer getYearWeekCount(Integer year) { Calendar c = Calendar.getInstance(); c.set(Calendar.YEAR, year); c.set(Calendar.MONTH, Calendar.DECEMBER); c.set(Calendar.DATE, 31); Integer weekCount = getWeekOfYear(c.getTimeInMillis()); //log.info("多少周:{}",weekCount); return weekCount; } public static Long getWeekStartTime(Integer year, Integer week) { Calendar c = new GregorianCalendar(); //获得指定年的第几周的开始日期(dayOfWeek是从周日开始排序的) c.setWeekDate(year, week, 2); c.set(Calendar.HOUR_OF_DAY, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); //获得Calendar的时间 Date starttime = c.getTime(); //log.info("{}年第{}周的开始日期为{}" ,year,week,paresTime(starttime.getTime(),FORMAT_LONG)); return starttime.getTime(); } public static Long getWeekEndTime(Integer year, Integer week) { Calendar c = new GregorianCalendar(); //获得指定年的第几周的结束日期 c.setWeekDate(year, week + 1, 1); c.set(Calendar.HOUR_OF_DAY, 23); c.set(Calendar.MINUTE, 59); c.set(Calendar.SECOND, 59); Date endtime = c.getTime(); //将时间戳格式化为指定格式 //log.info("{}年第{}周的结束日期为{}" ,year,week,paresTime(endtime.getTime(),FORMAT_LONG)); return endtime.getTime(); } /** * 得到上周最后一天 * * @return */ public static Long getPreWeekLastTime() { Calendar c = Calendar.getInstance(); c.setTimeInMillis(System.currentTimeMillis()); c.add(Calendar.DATE, -7); return DateUtils.getWeekEndTime(c.get(Calendar.YEAR), c.get(Calendar.WEEK_OF_YEAR)); } /** * 本月的结束时间 * * @return */ public static Long getMonthStartTime(Integer year, Integer month) { Calendar c = Calendar.getInstance(); c.set(Calendar.YEAR, year); c.set(Calendar.MONTH, month - 1); c.set(Calendar.DATE, 1); c.set(Calendar.HOUR_OF_DAY, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); return c.getTimeInMillis(); } /** * 本月的结束时间 * * @return */ public static Long getMonthEndTime(Integer year, Integer month) { Calendar c = Calendar.getInstance(); c.set(Calendar.YEAR, year); c.set(Calendar.MONTH, month - 1); c.add(Calendar.MONTH, 1); c.set(Calendar.DAY_OF_MONTH, 0); c.set(Calendar.HOUR_OF_DAY, 23); c.set(Calendar.MINUTE, 59); c.set(Calendar.SECOND, 59); return c.getTimeInMillis(); } /** * 得到上月最后一天时间 * * @return */ public static Long getPreMonthLastTime() { Calendar c = Calendar.getInstance(); c.add(Calendar.MONTH, -1); return getMonthEndTime(c.get(Calendar.YEAR), c.get(Calendar.MONTH) + 1); } /** * 本年的开始时间 * * @return */ public static Long getYearStartTime(Integer year) { Calendar c = Calendar.getInstance(); c.set(Calendar.YEAR, year); c.set(Calendar.MONTH, Calendar.JANUARY); c.set(Calendar.DATE, 1); c.set(Calendar.HOUR_OF_DAY, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); return c.getTimeInMillis(); } /** * 本年的开始时间 * * @return */ public static Long getYearEndTime(Integer year) { Calendar c = Calendar.getInstance(); c.set(Calendar.YEAR, year); c.set(Calendar.MONTH, Calendar.DECEMBER); c.set(Calendar.DATE, 31); c.set(Calendar.HOUR_OF_DAY, 23); c.set(Calendar.MINUTE, 59); c.set(Calendar.SECOND, 59); return c.getTimeInMillis(); } /** * 得到给定时间的 当天开始时间 * * @param time * @return */ public static Long getDayStart(Long time) { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(time); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); return calendar.getTimeInMillis(); } /** * 得到给定时间的 当天最大时间 * * @param time * @return */ public static Long getDayEnd(Long time) { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(time); calendar.set(Calendar.HOUR_OF_DAY, 23); calendar.set(Calendar.MINUTE, 59); calendar.set(Calendar.SECOND, 59); return calendar.getTimeInMillis(); } /** * 转换日期为:2023-10-10 00:00:00 再加上天数 * * @param time * @param days * @return */ public static Calendar getCalendarDayAndDays(Long time, int days) { Calendar calendar = Calendar.getInstance(); Date endDate = new Date(time); calendar.setTime(endDate); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); calendar.add(Calendar.DATE, days); return calendar; } /** * 日期加减天数,,中间跳过节假日 (不包括自己) * * @param time * @param days * @param holiday * @return */ public static Calendar getCalendarDayAndDays(Long time, int days, List holiday) { if (holiday == null) { holiday = new ArrayList<>(); } Calendar calendar = Calendar.getInstance(); Date endDate = new Date(time); calendar.setTime(endDate); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); if (days != 0) { boolean isAdd = true; if (days < 0) { isAdd = false; } int count = Math.abs(days); int sumCount = 0; while (true) { if (isAdd) { calendar.add(Calendar.DATE, 1); } else { calendar.add(Calendar.DATE, -1); } String str = DateUtils.paresTime(calendar.getTimeInMillis(), DateUtils.pattern); if (!holiday.contains(str)) { sumCount++; } else { log.info("休息日:{}", str); } if (count == sumCount) { break; } } } return calendar; } /** * 得到半年前的时间 * @return */ public static Long getSixMonthsAgo () { Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.MONTH, -6); Date sixMonthsAgo = calendar.getTime(); return sixMonthsAgo.getTime(); } public static List getCurrentIntegralPoint(String pattern) { // 获取当前日期 LocalDate today = LocalDate.now(); // 创建一个列表来存储格式化后的整点时间 List formattedWholeHours = new ArrayList<>(); // 遍历 00:00 到 23:00 的每一个整点 for (int hour = 0; hour < 24; hour++) { LocalTime time = LocalTime.of(hour, 0); // 整点时间 LocalDateTime dateTime = LocalDateTime.of(today, time); // 格式化时间 DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern); String formattedDateTime = dateTime.format(formatter); // 添加到列表 formattedWholeHours.add(formattedDateTime); } return formattedWholeHours; } public static List getYesterdayIntegralPoint(String pattern) { // 获取当前日期 LocalDate today = LocalDate.now().minusDays(1); // 创建一个列表来存储格式化后的整点时间 List formattedWholeHours = new ArrayList<>(); // 遍历 00:00 到 23:00 的每一个整点 for (int hour = 0; hour < 24; hour++) { LocalTime time = LocalTime.of(hour, 0); // 整点时间 LocalDateTime dateTime = LocalDateTime.of(today, time); // 格式化时间 DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern); String formattedDateTime = dateTime.format(formatter); // 添加到列表 formattedWholeHours.add(formattedDateTime); } return formattedWholeHours; } public static void main(String[] args) { log.info("本年开始时间:{},结束时间:{}", paresTime(getYearStartTime(2023), FORMAT_LONG), paresTime(getYearEndTime(2023), FORMAT_LONG)); log.info("本月开始时间:{},结束时间:{}", paresTime(getMonthStartTime(2023, 9), FORMAT_LONG), paresTime(getMonthEndTime(2023, 9), FORMAT_LONG)); Integer weekNumber = getWeekOfYear(System.currentTimeMillis()); log.info("本年一共{}周,本周是第{}周,本周时间区间:{}-{}", getYearWeekCount(2023), weekNumber, paresTime(getWeekStartTime(2023, weekNumber), FORMAT_LONG), paresTime(getWeekEndTime(2023, weekNumber), FORMAT_LONG)); Long time = DateUtils.timeToLong("2024-11-8", "yyyy-MM-dd"); String s = DateUtils.paresTime(time, "yyyy-MM-dd"); System.out.println("time : " + time); System.out.println("s : " + s); } public static WeekDayType getTimeWeekData(Long time) { Calendar c = Calendar.getInstance(); c.setTimeInMillis(time); int weekDay = c.get(Calendar.DAY_OF_WEEK); for (WeekDayType weekDayType : WeekDayType.values()) { if (weekDayType.getWeekDay() == weekDay) { return weekDayType; } } return null; } }