工具类分享

时间处理工具类分享

import org.apache.commons.lang.StringUtils;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
import java.util.*;
/**
 * @author SuperLong
 * @date 2022-05-16
 */
public class TimeUtil {

    public static final String TYPE_1 = "yyyy-MM-dd HH:mm:ss";

    public static final String TYPE_2 = "yyyy/MM/dd";

    public static final String TYPE_3 = "yyyyMMdd";

    public static final String TYPE_4 = "dd/MM/yyyy";

    public static final String TYPE_5 = "yyyy-MM-dd";

    public static final String TYPE_6 = "dd/MM/yyyy";

    public static final String TYPE_7 = "dd-MM-yy";

    public static final String TYPE_8 = "yyyy-MM";

    public static final String TYPE_9 = "yyyy年MM月dd日";

    public static final String TYPE_10 = "yyyyMMddHHmmssSSS";

    public static final String TYPE_11 = "yyyyMMddHHmmss";

    public static final String TYPE_13 = "HH:mm:ss";

    public static final long DAY_MILLS = 1000 * 60 * 60 * 24L;
    public static final Double DAY_MILLS_DOUBLE = 1000 * 60 * 60 * 24.0;

    public static final long HOUR_MILLS = 1000 * 60 * 60L;

    public static final long MONTH_MILLS = 30 * 24 * 1000 * 60 * 60L;

    public static String timeFormat(Long time, String formatTime) {
        if (Objects.isNull(time)) {
            return null;
        }
        DateFormat sdf = new SimpleDateFormat(formatTime);
        return sdf.format(time);
    }

    public static String timeStandardFormat(Long time) {
        DateFormat sdf = new SimpleDateFormat(TYPE_1);
        return sdf.format(time);
    }

    public static long parseTimeStr(String timeStr, String formatTime) {
        DateFormat sdf = new SimpleDateFormat(formatTime);
        try {
            return sdf.parse(timeStr).getTime();
        } catch (ParseException e) {
            throw new ServiceException("parse timeStr failed! error msg is {}" + e.getMessage());
        }
    }

    /**
     * 获得 days 天前时间的毫秒值
     */
    public static long getTimeBeforeDays(int days) {
        int beforeDay = -days;
        LocalDateTime localDateTime = LocalDateTime.now().plusDays(beforeDay);
        return localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
    }

    /**
     * 获得传入时间 days 天后时间的 毫秒值
     */
    public static long getMillTimeAfterDays(long startTime, int days) {
        return startTime + days * DAY_MILLS;
    }

    /**
     * 获得传入时间 days 天前时间的 毫秒值
     */
    public static long getMillTimeBeforeDays(long startTime, long days) {
        return startTime - days * DAY_MILLS;
    }

    /**
     * 获得传入时间 hours 小时后时间的 毫秒值
     */
    public static long getMillTimeAfterHours(long startTime, int hours) {
        return startTime + hours * HOUR_MILLS;
    }

    public static long timeParse(String timeStr, String formatTime) {
        DateFormat sdf = new SimpleDateFormat(formatTime);
        try {
            return sdf.parse(timeStr).getTime();
        } catch (ParseException e) {
            throw new ServiceException("parse timeStr failed! error msg is {}" + e.getMessage());
        }
    }

    public static long dateFormatMillTime(String timeStr) {
        long time = timeParse(timeStr, TYPE_2);
        return getMillTimeAfterDays(time, 1);
    }

    /**
     * 获取明天的零点时间戳
     */
    public static Long tomorrowZeroTime() {
        return getZeroTime(1);
    }

    /**
     * 获取当天的零点时间戳
     */
    public static Long todayZeroTime() {
        return getZeroTime(0);
    }

    /**
     * 获取当天的零点时间戳
     */
    public static Timestamp todayZeroTimestamp() {
        return new Timestamp(getZeroTime(0));
    }

    /**
     * 获取明天的零点时间戳
     */
    public static Timestamp tomorrowZeroTimestamp() {
        return new Timestamp(getZeroTime(1));
    }

    /**
     * 获取当天的零点时间戳 13位
     */
    public static Long todayZeroTimeMillisThirteen() {
        return new Timestamp(getZeroTime(0)).getTime();
    }

    /**
     * 获取当天的零点时间戳
     */
    public static Long todayZeroTimeMillis() {
        return new Timestamp(getZeroTime(0)).getTime() / 1000;
    }

    /**
     * 获取某天的零点时间戳
     */
    public static Long getZeroTime(int days) {
        //设置时区
        Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
        calendar.add(Calendar.DAY_OF_MONTH, days);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        return calendar.getTimeInMillis();
    }

    /**
     * 获取某天的零点时间戳
     */
    public static Timestamp getZeroTimestamp(int days) {
        //设置时区
        Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
        calendar.add(Calendar.DAY_OF_MONTH, days);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        return new Timestamp(calendar.getTimeInMillis());
    }


    /**
     * 一秒后的时间戳
     */
    public static Timestamp getOneSecondLater(Timestamp timestamp) {
        if (Objects.isNull(timestamp)) {
            return null;
        }

        return new Timestamp(timestamp.getTime() + 1000L);
    }

    /**
     * 获得当月1号零时零分零秒
     */
    public static Long thisMonthBeginTimestamp() {
        return initMonthBeginTimestamp(0);
    }

    /**
     * 获得上月1号零时零分零秒
     */
    public static Long lastMonthBeginTimestamp() {
        return initMonthBeginTimestamp(-1);
    }

    /**
     * 获得某月1号零时零分零秒
     */
    public static Long initMonthBeginTimestamp(int months) {
        Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
        //月份相加
        calendar.add(Calendar.MONTH, months);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        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();
    }

    public static String timeFormatWithType1(Long time) {
        return timeFormat(time, TYPE_1);
    }

    public static String timeFormatWithType2(Long time) {
        return timeFormat(time, TYPE_2);
    }

    public static String timeFormatWithType3(Long time) {
        return timeFormat(time, TYPE_3);
    }

    public static String timeFormatWithType4(Long time) {
        return timeFormat(time, TYPE_4);
    }

    public static String timeFormatWithType5(Long time) {
        return timeFormat(time, TYPE_5);
    }

    public static String timeFormatWithType6(Long time) {
        return timeFormat(time, TYPE_6);
    }

    public static String timeFormatWithType7(Long time) {
        return timeFormat(time, TYPE_7);
    }

    public static String timeFormatWithType8(Long time) {
        return timeFormat(time, TYPE_8);
    }

    public static String timeFormatWithType9(Long time) {
        return timeFormat(time, TYPE_9);
    }

    public static String timeFormatWithType10(Long time) {
        return timeFormat(time, TYPE_10);
    }

    public static String timeFormatWithType11(Long time) {
        return timeFormat(time, TYPE_11);
    }

    public static String timeFormatWithType13(Long time) {
        return timeFormat(time, TYPE_13);
    }

    public static Long parseTimeStrWithType1(String timeStr) {
        if (StringUtils.isBlank(timeStr)) {
            return null;
        }
        return parseTimeStr(timeStr, TYPE_1);
    }

    public static Long parseTimeStrWithType4(String timeStr) {
        if (StringUtils.isBlank(timeStr)) {
            return null;
        }
        return parseTimeStr(timeStr, TYPE_4);
    }

    public static Long parseTimeStrWithType5(String timeStr) {
        if (StringUtils.isBlank(timeStr)) {
            return null;
        }
        return parseTimeStr(timeStr, TYPE_5);
    }

    public static Timestamp parseTimestampWithType1(String timeStr) {
        if (StringUtils.isBlank(timeStr)) {
            return null;
        }
        try {
            return new Timestamp(parseTimeStr(timeStr, TYPE_1));
        } catch (Exception e) {
            return null;
        }
    }

    public static LocalDateTime getLocalDateTime(long timestamp) {
        Instant instant = Instant.ofEpochMilli(timestamp);
        ZoneId zoneId = ZoneId.systemDefault();
        return LocalDateTime.ofInstant(instant, zoneId);
    }

    public static Long getTimestamp(LocalDateTime localDateTime) {
        ZoneId zoneId = ZoneId.systemDefault();
        return localDateTime.atZone(zoneId).toInstant().toEpochMilli();
    }

    private static Long getMonthFirstDate(Long time) {
        // 设置当前日历实例的时间
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date(time));
        // 设置日历实例的月取值
        calendar.add(Calendar.MONTH, 1);
        // 设置日历实例的日取值
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        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();
    }


    public static List<String> getDayFormatList(Long beginTime, Long endTime) {
        List<String> result = new ArrayList<>();

        Long time = beginTime;
        while (time <= endTime) {
            result.add(timeFormatWithType5(time));
            time = getMillTimeAfterDays(time, 1);
        }

        return result;
    }

    public static List<String> getMonthFormatList(Long beginTime, Long endTime) {
        List<String> result = new ArrayList<>();

        Long time = beginTime;
        while (time <= endTime) {
            result.add(timeFormatWithType8(time));
            time = getMonthFirstDate(time);
        }

        return result;
    }

    // 获取该时间戳对应当天开始时间戳 13位
    public static Long getDayZeroTimeMillisThirteen(Long time) {
        String timeZone = "GMT+8:00";
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeZone(TimeZone.getTimeZone(timeZone));
        calendar.setTimeInMillis(time);
        calendar.add(Calendar.YEAR, 0);
        calendar.add(Calendar.MONTH, 0);
        calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH));
        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();
    }

    // 获取该时间戳对应当天开始时间戳 13位
    public static Long getDayZeroTimeMillis(Long time) {
        return getDayZeroTimeMillisThirteen(time) / 1000;
    }

    // 获取该时间戳对应当天结束时间戳
    public static Long getDayEndTimeMillis(Long time) {
        String timeZone = "GMT+8:00";
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeZone(TimeZone.getTimeZone(timeZone));
        calendar.setTimeInMillis(time);
        calendar.add(Calendar.YEAR, 0);
        calendar.add(Calendar.MONTH, 0);
        calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH));
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        calendar.set(Calendar.MILLISECOND, 999);
        return calendar.getTimeInMillis();
    }

    public static String formatToFormat(LocalDateTime createTime) {
        Long timestamp = getTimestamp(createTime);
        return timeFormatWithType9(timestamp);
    }

    public static Boolean isValidDateOfType5(String dateString) {
        if (StringUtils.isBlank(dateString)) {
            return Boolean.FALSE;
        }
        DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern(TYPE_5);
        try {
            // 使用DateTimeFormatter解析日期
            LocalDate.parse(dateString, FORMATTER);
            return Boolean.TRUE;
        } catch (DateTimeParseException e) {
            return Boolean.FALSE;
        }
    }

    public static Boolean isValidTimeOfType13(String timeString) {
        if (StringUtils.isBlank(timeString)) {
            return Boolean.FALSE;
        }
        DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern(TYPE_13);
        try {
            // 使用DateTimeFormatter解析时间
            LocalTime.parse(timeString, FORMATTER);
            return Boolean.TRUE;
        } catch (DateTimeParseException e) {
            return Boolean.FALSE;
        }
    }

    //public static void main(String[] args) {
    //    // 测试代码
    //    String validDate = "2023-03-151";
    //    String invalidDate = "2023-02-30";
    //    System.out.println("Is " + validDate + " a valid date? " + isValidDateOfType5(validDate));
    //    System.out.println("Is " + invalidDate + " a valid date? " + isValidDateOfType5(invalidDate));
    //    System.out.println("      ");
    //
    //    // 测试代码
    //    String validTime = "21:30:55";
    //    String invalidTime = "25:15:20";
    //    System.out.println("Is " + validTime + " a valid time? " + isValidTimeOfType13(validTime));
    //    System.out.println("Is " + invalidTime + " a valid time? " + isValidTimeOfType13(invalidTime));
    //}

    //public static void main(String[] args) {
    //    // 获取当前时间
    //    LocalDateTime now = LocalDateTime.now();
    //
    //    // 定义时间格式化器,格式为HH:mm:ss
    //    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
    //
    //    // 使用格式化器格式化当前时间,用于对比
    //    System.out.println("当前时间: " + now.format(formatter));
    //
    //    // 计算最近的半点
    //    LocalDateTime nearestHalfHour = getNearestHalfHour(now);
    //
    //    // 使用格式化器格式化最近的半点时间
    //    System.out.println("最近的半点: " + nearestHalfHour.format(formatter));
    //}

    /**
     * 获取已过去的最近的整点或半点
     */
    public static String getNearestHalfHour() {
        // 获取当前时间
        LocalDateTime now = LocalDateTime.now();
        // 定义时间格式化器,格式为HH:mm:ss
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(TYPE_13);
        // 计算最近的半点
        LocalDateTime nearestHalfHour = getNearestHalfHour(now);
        // 使用格式化器格式化最近的半点时间
        return nearestHalfHour.format(formatter);
    }

    public static LocalDateTime getNearestHalfHour(LocalDateTime time) {
        // 将秒和纳秒部分都清零,因为我们只关心到分钟
        LocalDateTime result = time.truncatedTo(ChronoUnit.MINUTES);

        // 获取当前的分钟数
        int minute = result.getMinute();

        // 如果当前分钟数大于等于30,调整到30分,否则调整到00分
        if (minute >= 30) {
            result = result.withMinute(30);
        } else {
            result = result.withMinute(0);
        }

        return result;
    }

    //public static void main(String[] args) {
    //    System.out.println("离今天最近的下一个星期一的Timestamp是:" + getNextWeekdayTimestamp(5));
    //}

    public static Timestamp getNextWeekdayTimestamp(int dayOfWeek) {
        // 以获取最近的星期一为例
        return getNextWeekdayTimestamp(DayOfWeek.of(dayOfWeek));
    }

    public static Timestamp getNextWeekdayTimestamp(DayOfWeek dayOfWeek) {
        // 获取当前日期时间
        LocalDateTime now = LocalDateTime.now();

        // 截断时间至当日00:00,以保证时间为00:00:00
        LocalDateTime todayMidnight = now.truncatedTo(ChronoUnit.DAYS);

        // 计算从今天起的下一个星期N(包括今天)
        LocalDateTime next = todayMidnight.with(TemporalAdjusters.nextOrSame(dayOfWeek));

        // 如果计算出的日期等于今天,则说明今天就是该星期几,那么我们需要获取下一周的星期N
        if (next.isEqual(todayMidnight)) {
            next = todayMidnight.with(TemporalAdjusters.next(dayOfWeek));
        }

        // 将LocalDateTime转换为Timestamp
        return Timestamp.valueOf(next);
    }

    public static void main(String[] args) {
        // 假设今天是星期二的上午10:00
        LocalDateTime now = LocalDateTime.now();
        System.out.println("当前时间:" + now);

        System.out.println("情况一的结果:" + getNextWeekdayTimestampWithTime(DayOfWeek.of(2), "12:00:00"));
        System.out.println("情况二的结果:" + getNextWeekdayTimestampWithTime(DayOfWeek.of(2), "09:00:00"));
    }

    public static Timestamp getNextWeekdayTimestampWithTime(int dayOfWeek, String timeString) {
        return getNextWeekdayTimestampWithTime(DayOfWeek.of(dayOfWeek), timeString);
    }

    public static Timestamp getNextWeekdayTimestampWithTime(DayOfWeek dayOfWeek, String timeString) {
        LocalDateTime now = LocalDateTime.now();

        // 解析时间参数
        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern(TYPE_13);
        LocalTime specificTime = LocalTime.parse(timeString, timeFormatter);

        // 当前日期时间的时间部分
        LocalTime nowTime = now.toLocalTime();

        // 如果今天就是要找的那个星期,并且当前时间还没到指定时间,则返回今天的指定时间
        if (now.getDayOfWeek() == dayOfWeek && nowTime.isBefore(specificTime)) {
            LocalDateTime resultToday = now.with(specificTime);
            return Timestamp.valueOf(resultToday);
        } else { // 否则找下一周的那一天
            LocalDateTime nextWeekday = now.with(TemporalAdjusters.next(dayOfWeek)).truncatedTo(ChronoUnit.DAYS).with(specificTime);
            return Timestamp.valueOf(nextWeekday);
        }
    }
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值