Android:TimeUtils-计算两个时间之间相差的时长(时分秒)、 判断当前日期是星期几、(昨天、今天,明天,周几)、根据今天获取昨天的日期、根据今天获取明天的日期、根据今天获取一年后的日期


import android.annotation.SuppressLint;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Objects;
import java.util.TimeZone;

public class TimeUtils {
    public final static String FORMAT_DATE = "yyyy-MM-dd";
    public final static String FORMAT_YEAR_MONTH = "yyyy-MM";
    public final static String FORMAT_TIME = "HH:mm";
    public final static String FORMAT_DATE_TIME = "yyyy-MM-dd HH:mm";
    public final static String FORMAT_DATE_TIME_FULL = "yyyy-MM-dd HH:mm:ss";
    public final static String FORMAT_MONTH_DAY_TIME = "MM月dd日 HH:mm";
    @SuppressLint("SimpleDateFormat")
    private static SimpleDateFormat sdf = new SimpleDateFormat();
    public static final int YEAR = 365 * 24 * 60 * 60;// 年
    public static final int MONTH = 30 * 24 * 60 * 60;// 月
    public static final int DAY = 24 * 60 * 60;// 天
    public static final int HOUR = 60 * 60;// 小时
    public static final int MINUTE = 60;// 分钟

    /**
     * 根据时间戳获取描述性时间,如3分钟前,1天前
     *
     * @param timestamp 时间戳 单位为毫秒
     * @return 时间字符串
     */
    public static String getDescriptionTimeFromTimestamp(long timestamp) {
        long currentTime = System.currentTimeMillis();
        long timeGap = (currentTime - timestamp) / 1000;// 与现在时间相差秒数
        System.out.println("timeGap: " + timeGap);
        String timeStr;
        if (timeGap > YEAR) {
            timeStr = timeGap / YEAR + "年前";
        } else if (timeGap > MONTH) {
            timeStr = timeGap / MONTH + "个月前";
        } else if (timeGap > DAY) {// 1天以上
            timeStr = timeGap / DAY + "天前";
        } else if (timeGap > HOUR) {// 1小时-24小时
            timeStr = timeGap / HOUR + "小时前";
        } else if (timeGap > MINUTE) {// 1分钟-59分钟
            timeStr = timeGap / MINUTE + "分钟前";
        } else {// 1秒钟-59秒钟
            timeStr = "刚刚";
        }
        return timeStr;
    }

    public static String getDescriptionTimeFromTimestamp(String timeStr, String format) {
        if (format == null || format.trim().equals("")) {
            sdf.applyPattern(FORMAT_DATE_TIME_FULL);
        } else {
            sdf.applyPattern(format);
        }
        try {
            Date date = sdf.parse(timeStr);
            return getDescriptionTimeFromTimestamp(Objects.requireNonNull(date).getTime());
        } catch (Exception e) {
            e.printStackTrace();
            return timeStr;
        }
    }

    /**
     * 根据时间戳获取指定格式的时间,如2011-11-30 08:40
     *
     * @param timestamp 时间戳 单位为毫秒
     * @param format    指定格式 如果为null或空串则使用默认格式"yyyy-MM-dd HH:MM"
     */
    public static String getFormatTimeFromTimestamp(long timestamp,
                                                    String format) {
        if (format == null || format.trim().equals("")) {
            sdf.applyPattern(FORMAT_DATE);
            int currentYear = Calendar.getInstance().get(Calendar.YEAR);
            int year = Integer.parseInt(sdf.format(new Date(timestamp))
                    .substring(0, 4));
            System.out.println("currentYear: " + currentYear);
            System.out.println("year: " + year);
            if (currentYear == year) {//如果为今年则不显示年份
                sdf.applyPattern(FORMAT_MONTH_DAY_TIME);
            } else {
                sdf.applyPattern(FORMAT_DATE_TIME);
            }
        } else {
            sdf.applyPattern(format);
        }
        sdf.setTimeZone(TimeZone.getTimeZone("GMT+0"));
        Date date = new Date(timestamp);
        return sdf.format(date);
    }

    /**
     * 根据时间戳获取时间字符串,并根据指定的时间分割数partionSeconds来自动判断返回描述性时间还是指定格式的时间
     *
     * @param timestamp      时间戳 单位是毫秒
     * @param partionSeconds 时间分割线,当现在时间与指定的时间戳的秒数差大于这个分割线时则返回指定格式时间,否则返回描述性时间
     */
    public static String getMixTimeFromTimestamp(long timestamp,
                                                 long partionSeconds, String format) {
        long currentTime = System.currentTimeMillis();
        long timeGap = (currentTime - timestamp) / 1000;// 与现在时间相差秒数
        if (timeGap <= partionSeconds) {
            return getDescriptionTimeFromTimestamp(timestamp);
        } else {
            return getFormatTimeFromTimestamp(timestamp, format);
        }
    }

    /**
     * 获取当前日期的指定格式的字符串
     *
     * @param format 指定的日期时间格式,若为null或""则使用指定的格式"yyyy-MM-dd HH:MM"
     */
    public static String getCurrentTime(String format) {
        if (format == null || format.trim().equals("")) {
            sdf.applyPattern(FORMAT_DATE_TIME);
        } else {
            sdf.applyPattern(format);
        }
        return sdf.format(new Date());
    }

    /**
     * 将日期字符串以指定格式转换为Date
     *
     * @param timeStr 日期字符串
     * @param format  指定的日期格式,若为null或""则使用指定的格式"yyyy-MM-dd"
     */
    public static Date getTimeFromString(String timeStr, String format) {
        if (format == null || format.trim().equals("")) {
            sdf.applyPattern(FORMAT_DATE);
        } else {
            sdf.applyPattern(format);
        }
        try {
            return sdf.parse(timeStr);
        } catch (ParseException e) {
            return new Date();
        }
    }

    /**
     * 将指定格式的日期字符串转换为年月形式的
     */
    public static String getYearMonthFromString(String timeStr, String format) {
        if (format == null || format.trim().equals("")) {
            sdf.applyPattern(FORMAT_DATE);
        } else {
            sdf.applyPattern(format);
        }
        @SuppressLint("SimpleDateFormat") SimpleDateFormat simpleDateFormat = new SimpleDateFormat(FORMAT_YEAR_MONTH);
        try {
            return simpleDateFormat.format(Objects.requireNonNull(sdf.parse(timeStr)));
        } catch (Exception e) {
            return timeStr;
        }
    }

    /**
     * 将指定格式的日期字符串转换为年月形式的
     */
    public static String getStringFromString(String timeStr, String format, String toFormat) {
        if (format == null || format.trim().equals("")) {
            sdf.applyPattern(FORMAT_DATE);
        } else {
            sdf.applyPattern(format);
        }
        try {
            @SuppressLint("SimpleDateFormat") SimpleDateFormat simpleDateFormat = new SimpleDateFormat(toFormat);
            return simpleDateFormat.format(Objects.requireNonNull(sdf.parse(timeStr)));
        } catch (Exception e) {
            return timeStr;
        }
    }

    public static String transTimeStr(String time) {
        return getStringFromString(time, FORMAT_DATE_TIME_FULL, FORMAT_DATE_TIME);
    }

    public static String transTimeStr1(String time) {
        return getStringFromString(time, FORMAT_DATE_TIME_FULL, FORMAT_DATE);
    }

    public static String transTimeStr2(String time) {
        return getStringFromString(time, "HH:mm:ss", FORMAT_TIME);
    }

    public static String transTimeStr(String time, String format) {
        return getStringFromString(time, FORMAT_DATE_TIME_FULL, format);
    }

    /**
     * 将日期字符串以指定格式转换为Calendar
     *
     * @param timeStr 日期字符串
     * @param format  指定的日期格式,若为null或""则使用指定的格式"yyyy-MM-dd"
     */
    public static Calendar getCalendarFromString(String timeStr, String format) {
        Calendar calendar = Calendar.getInstance();
        if (format == null || format.trim().equals("")) {
            sdf.applyPattern(FORMAT_DATE);
        } else {
            sdf.applyPattern(format);
        }
        try {
            calendar.setTime(Objects.requireNonNull(sdf.parse(timeStr)));
            return calendar;
        } catch (ParseException e) {
            calendar.setTime(new Date());
            return calendar;
        }
    }

    /**
     * 将Date以指定格式转换为日期时间字符串
     *
     * @param time   日期
     * @param format 指定的日期时间格式,若为null或""则使用指定的格式"yyyy-MM-dd"
     */
    public static String getStringFromTime(Date time, String format) {
        if (format == null || format.trim().equals("")) {
            sdf.applyPattern(FORMAT_DATE);
        } else {
            sdf.applyPattern(format);
        }
        return sdf.format(time);
    }

    /**
     * 将Date以指定格式转换为日期时间字符串
     *
     * @param time   日期
     * @param format 指定的日期时间格式,若为null或""则使用指定的格式"yyyy-MM-dd"
     */
    public static String getStringFromTime(Calendar time, String format) {
        if (format == null || format.trim().equals("")) {
            sdf.applyPattern(FORMAT_DATE);
        } else {
            sdf.applyPattern(format);
        }
        return sdf.format(time.getTime());
    }


    /**
     * 获取当前时间前后几天的时间
     */

    public static String beforeAfterDate(int days) {

        long nowTime = System.currentTimeMillis();
        long changeTimes = days * 24L * 60 * 60 * 1000;

        return getStrTime(String.valueOf(nowTime + changeTimes), FORMAT_DATE);

    }

    /**
     * 获取指定时间前后几天的时间
     */

    public static String beforeAfterDate(String time, int days, String format) {
        sdf.applyPattern(format);
        Date date;
        try {
            date = sdf.parse(time);
        } catch (Exception e) {
            e.printStackTrace();
            date = new Date();
        }
        long changeTimes = days * 24L * 60 * 60 * 1000;

        assert date != null;
        return getStrTime(String.valueOf(date.getTime() + changeTimes), FORMAT_DATE);

    }

    /**
     * 时间戳转字符串
     */

    public static String getStrTime(String timeStamp, String format) {

        String timeString;

        if (format == null || format.trim().equals("")) {
            sdf.applyPattern(FORMAT_DATE);
        } else {
            sdf.applyPattern(format);
        }

        long l = Long.parseLong(timeStamp);

        timeString = sdf.format(new Date(l));//单位秒

        return timeString;

    }


    /**
     * 根据提供的年月日获取该月份的第一天
     */
    public static String getSupportBeginDayOfMonth(Date date) {
        date.getTime();
        Calendar startDate = Calendar.getInstance();
        startDate.setTime(date);
        startDate.set(Calendar.DAY_OF_MONTH, 1);
        startDate.set(Calendar.HOUR_OF_DAY, 0);
        startDate.set(Calendar.MINUTE, 0);
        startDate.set(Calendar.SECOND, 0);
        startDate.set(Calendar.MILLISECOND, 0);
        Date firstDate = startDate.getTime();
        sdf.applyPattern(FORMAT_DATE);
        return sdf.format(firstDate);

    }

    /**
     * 根据提供的年月获取该月份的最后一天
     */
    public static String getSupportEndDayOfMonth(Date date) {
        Calendar startDate = Calendar.getInstance();
        startDate.setTime(date);
        startDate.set(Calendar.DAY_OF_MONTH, startDate.getActualMaximum(Calendar.DAY_OF_MONTH));
        startDate.set(Calendar.HOUR_OF_DAY, 23);
        startDate.set(Calendar.MINUTE, 59);
        startDate.set(Calendar.SECOND, 59);
        startDate.set(Calendar.MILLISECOND, 999);
        Date firstDate = startDate.getTime();
        sdf.applyPattern(FORMAT_DATE);
        return sdf.format(firstDate);
    }

    /**
     * 当天的开始时间
     */
    public static long startOfTodDay() {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        Date date = calendar.getTime();
        return date.getTime();
    }

    /**
     * 当天的结束时间
     */
    public static long endOfTodDay() {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        calendar.set(Calendar.MILLISECOND, 999);
        Date date = calendar.getTime();
        return date.getTime();
    }

    public static boolean beforeCurrent(String startTime) {
        sdf.applyPattern(FORMAT_DATE_TIME_FULL);
        try {
            Date date = sdf.parse(startTime);
            return Objects.requireNonNull(date).getTime() > System.currentTimeMillis();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 判断时间字符串是否在指定时间之前
     */
    public static boolean beforeTimes(String startTime, String target) {
        sdf.applyPattern(FORMAT_DATE_TIME_FULL);
        try {
            Date date = sdf.parse(startTime);
            Date targetDate = sdf.parse(target);
            return Objects.requireNonNull(date).getTime() > Objects.requireNonNull(targetDate).getTime();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    public static long getDistance(String startTime) {
        sdf.applyPattern(FORMAT_DATE_TIME_FULL);
        try {
            Date date = sdf.parse(startTime);
            return Objects.requireNonNull(date).getTime() - System.currentTimeMillis();
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }

    /**
     * 判断当前时间是否位于两个时间段之间
     */
    public static boolean isCurrentBetween(String startTime, String endTime) {
        sdf.applyPattern(FORMAT_DATE_TIME_FULL);
        try {
            Date startDate = sdf.parse(startTime);
            Date endDate = sdf.parse(endTime);
            return Objects.requireNonNull(startDate).getTime() < System.currentTimeMillis() && Objects.requireNonNull(endDate).getTime() > System.currentTimeMillis();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 计算两个时间之间相差的时长(时分秒)
     *
     * @param startTime
     * @param endTime
     * @param format
     * @return
     */
    public static String dateDiff(String startTime, String endTime, String format) {
        // 按照传入的格式生成一个simpledateformate对象
        SimpleDateFormat sd = new SimpleDateFormat(format);
        long nd = 1000 * 24 * 60 * 60;// 一天的毫秒数
        long nh = 1000 * 60 * 60;// 一小时的毫秒数
        long nm = 1000 * 60;// 一分钟的毫秒数
        long ns = 1000;// 一秒钟的毫秒数
        long diff;
        try {
            // 获得两个时间的毫秒时间差异
            diff = sd.parse(endTime).getTime() - sd.parse(startTime).getTime();
            long hour = diff / nh;// 计算差多少小时
            long min = diff % nh / nm;// 计算差多少分钟
            long sec = diff % nh % nm / ns;// 计算差多少秒

            String hourStr = hour < 9 ? "0" + hour : hour + "";
            String minStr = min < 9 ? "0" + min : min + "";
            String secStr = sec < 9 ? "0" + sec : sec + "";

            return hourStr + ":" + minStr + ":" + secStr;
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return "";

    }

    /**
     * //计算时间差
     * int daynumber = dateDiffDay(startDate, endDate, "yyyy-MM-dd");
     */
    public static long dateDiffDay(String startTime, String endTime, String format) {
        // 按照传入的格式生成一个simpledateformate对象
        SimpleDateFormat sd = new SimpleDateFormat(format);
        long nd = 1000 * 24 * 60 * 60;// 一天的毫秒数
        long nh = 1000 * 60 * 60;// 一小时的毫秒数
        long nm = 1000 * 60;// 一分钟的毫秒数
        long ns = 1000;// 一秒钟的毫秒数
        long diff;
        long day = 0;
        try {
            // 获得两个时间的毫秒时间差异
            diff = sd.parse(endTime).getTime()
                    - sd.parse(startTime).getTime();
            day = diff / nd;// 计算差多少天
            long hour = diff % nd / nh;// 计算差多少小时
            long min = diff % nd % nh / nm;// 计算差多少分钟
            long sec = diff % nd % nh % nm / ns;// 计算差多少秒
            // 输出结果
            System.out.println("时间相差:" + day + "天" + hour + "小时" + min
                    + "分钟" + sec + "秒。");
            if (day >= 1) {
                return day;
            } else {
                if (day == 0) {
                    return 1;
                } else {
                    return 0;
                }

            }

        } catch (ParseException e) {
            e.printStackTrace();
        }
        return 0;

    }

    /**
     * 判断当前时间是否位于某个时间点之前
     */
    public static boolean isCurrentBefore(String timeStr) {
        sdf.applyPattern(FORMAT_DATE_TIME_FULL);
        try {
            Date timeDate = sdf.parse(timeStr);
            return Objects.requireNonNull(timeDate).getTime() > System.currentTimeMillis();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    public static String getCurDayDate() {
        Calendar calendar = Calendar.getInstance();
        int CurYear = calendar.get(Calendar.YEAR);
        int CurMonth = calendar.get(Calendar.MONTH) + 1;
        int CurDay = calendar.get(Calendar.DATE);
        return CurYear + "-" + ((CurMonth < 10) ? "0" + CurMonth : CurMonth) + "-" + ((CurDay < 10) ? "0" + CurDay : CurDay);
    }

    /**
     * 三个月后
     *
     * @return
     */
    public static String getThreeMothLaterDate() {
        Calendar calendar = Calendar.getInstance();
        int CurYear = calendar.get(Calendar.YEAR);
        int CurMonth = calendar.get(Calendar.MONTH) + 4;
        int CurDay = calendar.get(Calendar.DATE);
        return CurYear + "-" + ((CurMonth < 10) ? "0" + CurMonth : CurMonth) + "-" + ((CurDay < 10) ? "0" + CurDay : CurDay);
    }


    public static String getCurDayDateStr() {
        Calendar calendar = Calendar.getInstance();
        int CurYear = calendar.get(Calendar.YEAR);
        int CurMonth = calendar.get(Calendar.MONTH) + 1;
        int CurDay = calendar.get(Calendar.DATE);
        return CurYear + "年" + CurMonth + "月" + CurDay + "日";
    }

    public static String getCurrentSelectedDate(int year, int month, int day) {
        String date = TimeUtils.getStringFromString(year + "-" + month + "-" + day, "", TimeUtils.FORMAT_DATE);
        return date;
    }

    /**
     * 转为字符串年月  格式:2021-04
     */
    public static String getStringYearMonth(int year, int month) {
        return year + "-" + ((month < 10) ? "0" + month : month);
    }


    public static int compare_date(String DATE1, String DATE2) {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date dt1 = df.parse(DATE1);
            Date dt2 = df.parse(DATE2);
            if (dt1.getTime() < dt2.getTime()) {
                System.out.println("dt1 在dt2前");
                return 1;
            } else if (dt1.getTime() > dt2.getTime()) {
                System.out.println("dt1在dt2后");
                return -1;
            } else {
                return 0;
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
        return 0;
    }

    /**
     * 判断当前日期是星期几
     *
     * @param pTime 设置的需要判断的时间  //格式如2021-09-08
     * @return dayForWeek 判断结果
     * @Exception 发生异常
     */
    public static String getWeek(String pTime) {
        String Week = "周";
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Calendar c = Calendar.getInstance();
        try {
            c.setTime(format.parse(pTime));

        } catch (ParseException e) {
            e.printStackTrace();
        }
        if (c.get(Calendar.DAY_OF_WEEK) == 1) {
            Week += "日";
        }
        if (c.get(Calendar.DAY_OF_WEEK) == 2) {
            Week += "一";
        }
        if (c.get(Calendar.DAY_OF_WEEK) == 3) {
            Week += "二";
        }
        if (c.get(Calendar.DAY_OF_WEEK) == 4) {
            Week += "三";
        }
        if (c.get(Calendar.DAY_OF_WEEK) == 5) {
            Week += "四";
        }
        if (c.get(Calendar.DAY_OF_WEEK) == 6) {
            Week += "五";
        }
        if (c.get(Calendar.DAY_OF_WEEK) == 7) {
            Week += "六";
        }
        return Week;
    }

    // strTime要转换的String类型的时间
    // formatType时间格式
    // strTime的时间格式和formatType的时间格式必须相同
    public static long stringToLong(String strTime, String formatType) {
        Date date = null; // String类型转成date类型
        try {
            date = stringToDate(strTime, formatType);
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (date == null) {
            return 0;
        } else {
            long currentTime = dateToLong(date); // date类型转成long类型
            return currentTime;
        }
    }

    // strTime要转换的string类型的时间,formatType要转换的格式yyyy-MM-dd HH:mm:ss//yyyy年MM月dd日
    // HH时mm分ss秒,
    // strTime的时间格式必须要与formatType的时间格式相同
    public static Date stringToDate(String strTime, String formatType) {
        SimpleDateFormat formatter = new SimpleDateFormat(formatType);
        Date date = null;
        try {
            date = formatter.parse(strTime);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

    // date要转换的date类型的时间
    public static long dateToLong(Date date) {
        return date.getTime();
    }

    /**
     * (昨天、今天,明天,周几)
     */
    public static String getDayWeek(String time) {
        try {
            long DAY = 24 * 60 * 60 * 1000L;
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
            String t1 = df.format(new Date(System.currentTimeMillis()));
            long today = df.parse(t1).getTime();
            long target = df.parse(time).getTime();
            long d = today - target;
            if (d == 0L) {
                return "今天";
            } else if (d == DAY) {
                return "昨天";
            } else if (d == -DAY) {
                return "明天";
            } else {
                return getWeek(time);
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return "";
    }

    /**
     * 根据今天获取昨天的日期
     *
     * @return
     */
    public static String getLastDateFromCurrent(String currentDayStr) {
        long DAY = 24 * 60 * 60 * 1000L;
        sdf.applyPattern(FORMAT_DATE);
        try {
            Date date = sdf.parse(currentDayStr);
            long time = Objects.requireNonNull(date).getTime();
            long yesterday = time - DAY;
            String yesterdayStr = longToString(yesterday, FORMAT_DATE);
            return yesterdayStr;
        } catch (Exception e) {
            e.printStackTrace();
            return currentDayStr;
        }
    }


    /**
     * 根据今天获取明天的日期
     *
     * @return
     */
    public static String getTomorrowDateFromCurrent(String currentDayStr) {
        long DAY = 24 * 60 * 60 * 1000L;
        sdf.applyPattern(FORMAT_DATE);
        try {
            Date date = sdf.parse(currentDayStr);
            long time = Objects.requireNonNull(date).getTime();
            long Tomorrow = time + DAY;
            String TomorrowStr = longToString(Tomorrow, FORMAT_DATE);
            return TomorrowStr;
        } catch (Exception e) {
            e.printStackTrace();
            return currentDayStr;
        }
    }

    /**
     * 根据今天获取一年后的日期
     *
     * @return
     */
    public static String getOneYearDateFromCurrent(String currentDayStr) {
        long DAY = 365 * 24 * 60 * 60 * 1000L;
        sdf.applyPattern(FORMAT_DATE);
        try {
            Date date = sdf.parse(currentDayStr);
            long time = Objects.requireNonNull(date).getTime();
            long Tomorrow = time + DAY;
            String TomorrowStr = longToString(Tomorrow, FORMAT_DATE);
            return TomorrowStr;
        } catch (Exception e) {
            e.printStackTrace();
            return currentDayStr;
        }
    }


    // currentTime要转换的long类型的时间
    // formatType要转换的string类型的时间格式
    public static String longToString(long currentTime, String formatType) {
        Date date = null; // long类型转成Date类型
        try {
            date = longToDate(currentTime, formatType);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        String strTime = dateToString(date, formatType); // date类型转成String
        return strTime;
    }


    /**
     * long转换为Date类型
     * // currentTime要转换的long类型的时间
     * // formatType要转换的时间格式yyyy-MM-dd HH:mm:ss//yyyy年MM月dd日 HH时mm分ss秒
     */

    public static Date longToDate(long currentTime, String formatType)
            throws ParseException {
        Date dateOld = new Date(currentTime); // 根据long类型的毫秒数生命一个date类型的时间
        String sDateTime = dateToString(dateOld, formatType); // 把date类型的时间转换为string
        Date date = stringToDate(sDateTime, formatType); // 把String类型转换为Date类型
        return date;
    }

    // formatType格式为yyyy-MM-dd HH:mm:ss//yyyy年MM月dd日 HH时mm分ss秒
    // data Date类型的时间
    public static String dateToString(Date data, String formatType) {
        return new SimpleDateFormat(formatType).format(data);
    }

}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮你解决这个问题。首先,我们需要将传入的工作时间段和空闲时间段字符串解析成时间段列表,然后对它们进行比较。 以下是一个可能的实现: ```java import java.time.LocalTime; import java.util.ArrayList; import java.util.List; public class TimeUtils { public static LocalTime findFirstFreeTime(String workTimes, String freeTimes) { List<TimeRange> workRanges = parseTimeRanges(workTimes); List<TimeRange> freeRanges = parseTimeRanges(freeTimes); LocalTime lastWorkEndTime = getLastWorkEndTime(workRanges); for (TimeRange freeRange : freeRanges) { if (freeRange.getEnd().equals(lastWorkEndTime)) { LocalTime firstFreeTime = findFirstContinuousFreeTime(freeRanges, freeRange); if (firstFreeTime != null) { return firstFreeTime; } } } return null; } private static List<TimeRange> parseTimeRanges(String times) { List<TimeRange> ranges = new ArrayList<>(); String[] rangeStrs = times.split(";"); for (String rangeStr : rangeStrs) { String[] parts = rangeStr.split("-"); TimeRange range = new TimeRange(LocalTime.parse(parts[0]), LocalTime.parse(parts[1])); ranges.add(range); } return ranges; } private static LocalTime getLastWorkEndTime(List<TimeRange> workRanges) { TimeRange lastRange = workRanges.get(workRanges.size() - 1); return lastRange.getEnd(); } private static LocalTime findFirstContinuousFreeTime(List<TimeRange> freeRanges, TimeRange currentRange) { int currentIndex = freeRanges.indexOf(currentRange); for (int i = currentIndex - 1; i >= 0; i--) { TimeRange prevRange = freeRanges.get(i); if (prevRange.getEnd().equals(currentRange.getStart())) { return prevRange.getStart(); } else if (!prevRange.getStart().isBefore(currentRange.getStart())) { break; } currentRange = prevRange; } return null; } private static class TimeRange { private final LocalTime start; private final LocalTime end; public TimeRange(LocalTime start, LocalTime end) { this.start = start; this.end = end; } public LocalTime getStart() { return start; } public LocalTime getEnd() { return end; } } } ``` 这里定义了一个`TimeRange`类来表示时间段,它包含一个开始时间和一个结束时间。`parseTimeRanges`方法将传入的时间段字符串解析成时间段列表,`getLastWorkEndTime`方法获取工作时间段的最后一个结束时间,`findFirstContinuousFreeTime`方法在空闲时间段列表中查找当前时间段之前的连续空闲时间段,并返回第一个连续空闲时间段的开始时间。最后,`findFirstFreeTime`方法将这些方法组合起来,实现整个逻辑。 你可以这样调用它: ```java LocalTime firstFreeTime = TimeUtils.findFirstFreeTime( "08:00-10:00;13:00-15:00", "09:10-10:00;13:00-15:00" ); System.out.println(firstFreeTime); // 输出09:10 ``` 注意,这个实现假设传入的时间段字符串是合法的,并且工作时间段和空闲时间段都是按照开始时间排序的。如果这些假设不成立,就需要对代码进行适当的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值