DateUtil工具类

这是一个Java日期处理工具类(DateUtils),提供了丰富的日期操作功能。,使用Joda-Time和Calendar类实现,支持常见的业务场景日期处理需求。

主要包括:

1) 多种日期格式的格式化与解析;

2) 日期加减操作(秒、分钟、小时、天、周、月、年);

3) 获取特定时间点(当月/年第一天/最后一天、周区间);

4) 日期判断(是否周末、是否在时间段内、是否当月);

5) 获取相对日期(上月、上年同日、上一天等);

6) 日期计算(时间差、月份最大天数等)。

 

import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;


/**
 * 日期处理工具类
 */
public class DateUtils {
    /**
     * 时间格式(yyyy)
     */
    public final static String YEAR_PATTERN = "yyyy";
    /**
     * 时间格式(yyyy-MM)
     */
    public final static String MONTH_PATTERN = "yyyy-MM";
    /**
     * 时间格式(yyyy-MM-dd)
     */
    public final static String DATE_PATTERN = "yyyy-MM-dd";
    /**
     * 时间格式(yyyy-MM-dd HH:mm)
     */
    public final static String DATE_MINUTE_PATTERN = "yyyy-MM-dd HH:mm";
    /**
     * 时间格式(yyyy-MM-dd HH:mm:ss)
     */
    public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
    /**
     * 时间格式(HH:mm:ss)
     */
    public final static String TIME_PATTERN = "HH:mm:ss";
    /**
     * 时间格式(HH:mm)
     */
    public final static String MINUTE_PATTERN = "HH:mm";

    /**
     * 日期格式化 日期格式为:yyyy-MM-dd
     *
     * @param date 日期
     * @return 返回yyyy-MM-dd格式日期
     */
    public static String format(Date date) {
        return format(date, DATE_PATTERN);
    }

    /**
     * 日期格式化 日期格式为: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;
    }

    /**
     * 字符串转换成日期
     *
     * @param strDate 日期字符串
     * @param pattern 日期的格式,如:DateUtils.DATE_TIME_PATTERN
     */
    public static Date stringToDate(String strDate, String pattern) {
        if (StringUtils.isBlank(strDate)) {
            return null;
        }

        DateTimeFormatter fmt = DateTimeFormat.forPattern(pattern);
        return fmt.parseLocalDateTime(strDate).toDate();
    }

    /**
     * 根据周数,获取开始日期、结束日期
     *
     * @param week 周期  0本周,-1上周,-2上上周,1下周,2下下周
     * @return 返回date[0]开始日期、date[1]结束日期
     */
    public static Date[] getWeekStartAndEnd(int week) {
        DateTime dateTime = new DateTime();
        LocalDate date = new LocalDate(dateTime.plusWeeks(week));

        date = date.dayOfWeek().withMinimumValue();
        Date beginDate = date.toDate();
        Date endDate = date.plusDays(6).toDate();
        return new Date[]{beginDate, endDate};
    }

    /**
     * 对日期的【秒】进行加/减
     *
     * @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();
    }

    /**
     * 获取当月的第一天
     *
     * @return 当月的第一天
     */
    public static Date getCurrMonthFirst() {
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.MONTH, 0);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        return calendar.getTime();
    }

    /**
     * 获取当月的最后一天
     *
     * @return 当月的最后一天
     */
    public static Date getCurrMonthLast() {
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.MONTH, 1);
        calendar.set(Calendar.DAY_OF_MONTH, 0);
        return calendar.getTime();
    }

    /**
     * 获取当年的第一天
     *
     * @return
     */
    public static Date getCurrYearFirst() {
        Calendar currCal = Calendar.getInstance();
        int currentYear = currCal.get(Calendar.YEAR);
        return getYearFirst(currentYear);
    }

    /**
     * 获取当年的最后一天
     *
     * @return
     */
    public static Date getCurrYearLast() {
        Calendar currCal = Calendar.getInstance();
        int currentYear = currCal.get(Calendar.YEAR);
        return getYearLast(currentYear);
    }

    /**
     * 获取某年第一天日期
     *
     * @param year 年份
     * @return Date
     */
    public static Date getYearFirst(int year) {
        Calendar calendar = Calendar.getInstance();
        calendar.clear();
        calendar.set(Calendar.YEAR, year);
        return calendar.getTime();
    }

    /**
     * 获取某年最后一天日期
     *
     * @param year 年份
     * @return Date
     */
    public static Date getYearLast(int year) {
        Calendar calendar = Calendar.getInstance();
        calendar.clear();
        calendar.set(Calendar.YEAR, year);
        calendar.roll(Calendar.DAY_OF_YEAR, -1);
        return calendar.getTime();
    }

    /**
     * 判断是否是周末
     *
     * @param date
     * @return
     */
    public static boolean isWeekends(Date date) {
        Calendar ca = Calendar.getInstance();
        ca.setTime(date);
        if (ca.get(Calendar.DAY_OF_WEEK) == 1
                || ca.get(Calendar.DAY_OF_WEEK) == 7) {
            return true;
        }
        return false;
    }

    /**
     * 判断当前时间是否在[startTime, endTime]区间,注意三个参数的时间格式要一致
     *
     * @param nowTime
     * @param startTime
     * @param endTime
     * @return 在时间段内返回true,不在返回false
     */
    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);
    }

    /**
     * 判断当前时间是否在[startTime, endTime]区间
     *
     * @param nowTime   时间
     * @param startTime 字符串
     * @param endTime   字符串
     * @return 在时间段内返回true,不在返回false
     */
    public static boolean isEffectiveDate(Date nowTime, String startTime, String endTime) {
        Date start = parse(startTime, TIME_PATTERN);
        Date end = parse(endTime, TIME_PATTERN);
        if (nowTime == null || start == null || end == null) {
            return false;
        }
        return isEffectiveDate(nowTime, start, end);
    }

    public static boolean inCurrentMonth(Date givenDate) {
        Date today = new Date();
        return givenDate.getMonth() == today.getMonth() && givenDate.getYear() == today.getYear();
    }


    /**
     * 根据传入日期获取上月日期
     * @param date
     * @return
     * @throws ParseException
     */
    public static String getLastMonthDate(String date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
        // 使用Calendar类调整日期
        Calendar calendar = Calendar.getInstance();
        try {
            calendar.setTime(sdf.parse(date));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        calendar.add(Calendar.MONTH, -1); // 将月份减去1,得到上个月的日期
        return sdf.format(calendar.getTime());
    }

    /**
     * 根据传入日期获取上年同月日期
     * @return
     */
    public static String getLastYearMonthDate(String date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
        // 使用Calendar类调整日期
        Calendar calendar = Calendar.getInstance();
        try {
            calendar.setTime(sdf.parse(date));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        calendar.add(Calendar.YEAR, -1); // 将年减一获取上年同月
        return sdf.format(calendar.getTime());
    }


    /**
     * 获取上月传入天
     * @param date
     * @return
     */
    public static String getLastMonthDay(String date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
        // 使用Calendar类调整日期
        Calendar calendar = Calendar.getInstance();
        try {
            calendar.setTime(sdf.parse(date));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        calendar.add(Calendar.MONTH, -1); // 上月传入天
        return sdf.format(calendar.getTime());
    }

    /**
     * 获取传入日期上一年
     * @param date
     * @return
     */
    public static String getLastYearDate(String date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
        // 使用Calendar类调整日期
        Calendar calendar = Calendar.getInstance();
        try {
            calendar.setTime(sdf.parse(date));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        calendar.add(Calendar.YEAR, -1); // 上期年
        return sdf.format(calendar.getTime());
    }


    /**
     * 获取上一天
     * @param date
     * @return
     */
    public static String getLastDay(String date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        // 使用Calendar类调整日期
        Calendar calendar = Calendar.getInstance();
        try {
            calendar.setTime(sdf.parse(date));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        calendar.add(Calendar.DAY_OF_MONTH, -1); // 获取上一天
        return sdf.format(calendar.getTime());
    }



    /**
     * 根据日期获取星期几
     * @return
     */
    public static String getWeekByDate(String strDate) {
        // 获取当前日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        // 解析日期字符串
        Date parseDate = null;
        try {
            parseDate = sdf.parse(strDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        // 获取日期对应的星期几
        String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(parseDate);
        int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
        return weekDays[dayOfWeek - 1];

    }


    /**
     * 获取传入日期本月开始日期
     * @param date
     * @return
     */
    public static String getStartOfMonth(String date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
        Calendar calendar = Calendar.getInstance();
        try {
            calendar.setTime(sdf.parse(date));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        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);
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
        return sdf2.format(calendar.getTime());
    }

    /**
     * 获取传入日期本月结束日期
     * @param date
     * @return
     */
    public static String getEndOfMonth(String date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
        Calendar calendar = Calendar.getInstance();
        try {
            calendar.setTime(sdf.parse(date));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(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);
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
        return sdf2.format(calendar.getTime());
    }


    /**
     * 获取昨天日期
     * @return
     */
    public static String getYesterday() {
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DAY_OF_MONTH, -1);
        Date yesterday = calendar.getTime();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String formattedDate = sdf.format(yesterday);
        return formattedDate;
    }


    /**
     * 获取两个日期时间差
     */
    public static long getTimeDifference(Date startDate, Date endDate) {
        long startTime = startDate.getTime();
        long endTime = endDate.getTime();
        //计算毫秒差值
        long millisecondDiff = endTime - startTime;
        long hourDiff = millisecondDiff / (1000 * 60 * 60);
        return hourDiff;
    }

    /**
     * 获取月份最大天
     * @param date
     * @return
     */
    public static String getNaxNum(String date)  {
        Calendar c = Calendar.getInstance();
        SimpleDateFormat sdf0 = new SimpleDateFormat("yyyy-MM");
        Date dd = null;
        try {
            dd = sdf0.parse(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        c.setTime(dd);
        int cc = c.getActualMaximum(Calendar.DAY_OF_MONTH);
        return String.valueOf(cc);
    }
}

### Python `dateutil` 工具类使用方法 #### 安装 为了使用 `dateutil` 库,首先需要安装它。可以通过 pip 来完成这一操作: ```bash pip install python-dateutil ``` #### 基本功能展示 ##### 解析日期字符串 `dateutil.parser.parse()` 函数能够解析多种格式的日期字符串并返回对应的 datetime 对象。 ```python from dateutil import parser date_string = "2023-10-01T14:30Z" parsed_date = parser.parse(date_string) print(parsed_date) # 输出:2023-10-01 14:30:00+00:00 ``` ##### 复杂的时间计算 利用 `relativedelta` 可以方便地执行复杂的日期运算,比如增加或减少月份、年份等。 ```python from dateutil.relativedelta import relativedelta from datetime import datetime current_time = datetime.now() future_time = current_time + relativedelta(months=+6, days=-5) print(future_time.strftime("%Y-%m-%d %H:%M")) # 根据需求调整输出格式 ``` ##### 获取重复事件序列 对于周期性的活动安排,如每周一次会议,则可借助 rrule 功能来获取一系列发生时刻。 ```python from dateutil.rrule import rrule, WEEKLY from datetime import timedelta, datetime start_day = datetime(2023, 9, 1) end_day = start_day + timedelta(days=7*8) # 计划八周内的所有周五 weekly_meetings = list(rrule(freq=WEEKLY, byweekday=start_day.weekday(), dtstart=start_day, until=end_day)) for meeting in weekly_meetings: print(meeting.date()) ``` 以上展示了如何通过 `dateutil` 实现基本的日期解析、复杂时间间隔计算以及规律性事件列表生成等功能[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值