Java传统Date工具类封装

昨天看了公司的一个日期操作的工具类,感觉不全面,于是准备自己动手再写一个,下面是我完善的一个日期的操作工具类,主要针对的是Java中传统的Date类型的一些基本操作进行封装,由于代码中引用了一些我写的枚举,直接复制可能导致一些地方报错,可以在github中查看其它依赖的类

github地址:https://github.com/wjxScott/Code/tree/master/Common/src/main/java/com/wjx/utils

package com.wjx.utils;

import com.wjx.enums.DatePatternEnum;
import com.wjx.enums.ErrorEnum;
import com.wjx.exceptions.BaseException;

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

/**
 * 日期操作工具类
 *
 * @author WJX
 * @date 2018/7/16 17:06
 */
public class DateUtils {

    /**
     * 一天的毫秒数
     */
    public static final long DAY_IN_MILLISECODE = 24 * 60 * 60 * 1000;

    /**
     * 通过输入date获取只到日的时间
     *
     * @param date 输入的时间
     * @return 返回date,只到日
     * @throws BaseException
     */
    public static Date asDay(Date date) throws BaseException {
        return parseDate(format(date, DatePatternEnum.DEFAULT_DATE_PATTERN.getPattern()), DatePatternEnum.DEFAULT_DATE_PATTERN.getPattern());
    }

    /**
     * 通过输入string类型的时间,返回date类型的date,只到日
     *
     * @param dateString
     * @return 返回date,只到日
     * @throws BaseException
     */
    public static Date asDay(String dateString) throws BaseException {
        return parseDate(dateString, DatePatternEnum.DEFAULT_DATE_PATTERN.getPattern());
    }

    /**
     * 通过输入date获取只到月的时间
     *
     * @param date 输入的时间
     * @return 返回date,只到月
     * @throws BaseException
     */
    public static Date asMonth(Date date) throws BaseException {
        return parseDate(format(date, DatePatternEnum.DATE_PATTERN_YEARMONTH.getPattern()), DatePatternEnum.DATE_PATTERN_YEARMONTH.getPattern());
    }

    /**
     * 通过输入string类型的时间,返回date类型的date,只到月
     *
     * @param dateString
     * @return 返回date,只到月
     * @throws BaseException
     */
    public static Date asMonth(String dateString) throws BaseException {
        return parseDate(dateString, DatePatternEnum.DATE_PATTERN_YEARMONTH.getPattern());
    }

    /**
     * 以yyyy-MM-dd形式返回今天的日期字符串
     *
     * @return 今天的日期
     * @throws BaseException
     */
    public static String getToday() throws BaseException {
        return format(new Date(), DatePatternEnum.DATE_PATTERN_YEARMONTH.getPattern());
    }

    /**
     * 返回yyyy-MM格式的日期字符串,即本月
     *
     * @return 本月的日期
     * @throws BaseException
     */
    public static String getThisMonth() throws BaseException {
        return format(new Date(), DatePatternEnum.DATE_PATTERN_YEARMONTH.getPattern());
    }

    /**
     * 通过输入年、月、日,按照输入的pattern的形式输出日期的字符
     * month的值应该在 1-12之间,如果不是会改变year的值,如year为2018,month为13,输出的year为2019,month为 1,同理day的值也会影响month的值
     *
     * @param year    年
     * @param month   月
     * @param day     日
     * @param pattern 日期的格式
     * @return 格式化日期类型的字符串
     */
    public static String format(int year, int month, int day, String pattern) throws BaseException {
        return format(year, month, day, 0, 0, 0, pattern);
    }

    /**
     * 通过输入年、月、日、时、分、秒,按照输入的pattern的形式输出日期的字符
     * month的值应该在 1-12之间,如果不是会改变year的值,如year为2018,month为13,输出的year为2019,month为 1
     * 同理day的值也会影响month的值,hour的值会影响day,minute会影响hour,second会影响minute
     *
     * @param year    年
     * @param month   月
     * @param day     日
     * @param hour    时
     * @param minute  分
     * @param second  秒
     * @param pattern 日期的格式
     * @return 格式化日期类型的字符串
     */
    public static String format(int year, int month, int day, int hour, int minute, int second, String pattern) throws BaseException {
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, month - 1, day, hour, minute, second);
        try {
            return format(calendar.getTime(), pattern);
        } catch (Exception e) {
            throw new com.wjx.exceptions.DateTimeParseException(ErrorEnum.DATE_PARSE_ERROR);
        }
    }

    /**
     * 将date按照输入的pattern转换成string格式的字符串
     *
     * @param date    日期
     * @param pattern 格式化的类型
     * @return 格式化的日期字符串
     */
    public static String format(Date date, String pattern) throws BaseException {
        if (date == null || StringUtils.isEmpty(pattern)) {
            throw new IllegalArgumentException("date和pattern都不能为空");
        }

        return new SimpleDateFormat(pattern).format(date);
    }

    /**
     * 通过输入年、月、日,按照输入的pattern的形式返回date类型的数据
     *
     * @param year    年
     * @param month   月
     * @param day     日
     * @param pattern 格式化的类型
     * @return pattern形式的date
     */
    public static Date parseDate(int year, int month, int day, String pattern) throws BaseException {
        return parseDate(format(year, month, day, pattern), pattern);
    }

    /**
     * 通过输入年、月、日、时、分、秒,按照输入的pattern的形式返回date类型的数据
     *
     * @param year    年
     * @param month   月
     * @param day     日
     * @param hour    时
     * @param minute  分
     * @param second  秒
     * @param pattern 格式化的类型
     * @return pattern形式的date
     */
    public static Date parseDate(int year, int month, int day, int hour, int minute, int second, String pattern) throws BaseException {
        return parseDate(format(year, month, day, hour, minute, second, pattern), pattern);
    }

    /**
     * 将string类型的时间转换成date,格式不能错误,否则会有异常
     *
     * @param dateString string类型的时间
     * @param pattern    格式化的类型
     * @return date类型的时间
     */
    public static Date parseDate(String dateString, String pattern) throws BaseException {
        return parseDate(dateString, new String[]{pattern});
    }


    /**
     * 将string类型的时间转换成date,格式不能错误,否则会有异常
     *
     * @param dateString string类型的时间
     * @param patterns   格式化的类型数组
     * @return date类型的时间
     */
    public static Date parseDate(String dateString, String... patterns) throws BaseException {
        if (StringUtils.isEmpty(dateString) || StringUtils.stringArrayIsEmpty(patterns)) {
            throw new IllegalArgumentException("dateString和patterns都不能为空");
        }

        try {
            //调用Apache的DateUtils.parseDate,如果时间和输入的模式不对应会出错
            return org.apache.commons.lang3.time.DateUtils.parseDate(dateString, patterns);
        } catch (Exception e) {
            throw new com.wjx.exceptions.DateTimeParseException(ErrorEnum.DATE_PARSE_ERROR);
        }
    }

    /**
     * 对输入的日期进行毫秒的加减操作
     *
     * @param date   要操作的date
     * @param amount 增量
     * @return 修改后的date
     */
    public static Date addMilliseconds(final Date date, final int amount) {
        return add(date, Calendar.MILLISECOND, amount);
    }

    /**
     * 对输入的日期进行秒的加减操作
     *
     * @param date   要操作的date
     * @param amount 增量
     * @return 修改后的date
     */
    public static Date addSeconds(final Date date, final int amount) {
        return add(date, Calendar.SECOND, amount);
    }

    /**
     * 对输入的日期进行分钟的加减操作
     *
     * @param date   要操作的date
     * @param amount 增量
     * @return 修改后的date
     */
    public static Date addMinutes(final Date date, final int amount) {
        return add(date, Calendar.MINUTE, amount);
    }

    /**
     * 对输入的日期进行小时的加减操作
     *
     * @param date   要操作的date
     * @param amount 增量
     * @return 修改后的date
     */
    public static Date addHours(final Date date, final int amount) {
        return add(date, Calendar.HOUR_OF_DAY, amount);
    }

    /**
     * 对输入的日期进行day的加减操作
     *
     * @param date   要操作的date
     * @param amount 增量
     * @return 修改后的date
     */
    public static Date addDays(final Date date, final int amount) {
        return add(date, Calendar.DAY_OF_MONTH, amount);
    }

    /**
     * 对输入的日期进行星期的加减操作
     *
     * @param date   要操作的date
     * @param amount 增量
     * @return 修改后的date
     */
    public static Date addWeeks(final Date date, final int amount) {
        return add(date, Calendar.WEEK_OF_YEAR, amount);
    }

    /**
     * 对输入的日期进行月份的加减操作
     *
     * @param date   要操作的date
     * @param amount 增量
     * @return 修改后的date
     */
    public static Date addMonths(final Date date, final int amount) {
        return add(date, Calendar.MONTH, amount);
    }

    /**
     * 对输入的日期进行年的加减操作
     *
     * @param date   要操作的date
     * @param amount 增量
     * @return 修改后的date
     */
    public static Date addYears(final Date date, final int amount) {
        return add(date, Calendar.YEAR, amount);
    }

    /**
     * 输入date类型的时间和calendarField对时间进行加减操作
     * 此方法为其他方法的底层调用,来源Apache的DateUtils
     *
     * @param date          要操作的date
     * @param calendarField 操作的date的范围,输入Calendar的枚举
     * @param amount        修改操作的增量
     * @return 修改后的date
     */
    private static Date add(final Date date, final int calendarField, final int amount) {
        if (date == null) {
            throw new IllegalArgumentException("输入的date不能为null");
        }
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(calendarField, amount);
        return c.getTime();
    }

    /**
     * 输入date返回int类型的date的年份
     *
     * @param date 输入的date数据
     * @return date的年份
     */
    public static int getYearForInt(Date date) {
        if (date == null) {
            throw new IllegalArgumentException("date不能为null");
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.YEAR);
    }

    /**
     * 输入date返回int类型的date的年份
     *
     * @param date 输入的date数据
     * @return date的年份
     */
    public static String getYearForString(Date date) {
        return String.valueOf(getYearForInt(date));
    }

    /**
     * 输入date返回int类型的date的月份
     *
     * @param date 输入的date数据
     * @return date的月份
     */
    public static int getMonthForInt(Date date) {
        if (date == null) {
            throw new IllegalArgumentException("date不能为null");
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.MONTH) + 1;
    }

    /**
     * 输入date返回int类型的date的月份
     *
     * @param date 输入的date数据
     * @return date的月份
     */
    public static String getMonthForString(Date date) {
        int month = getMonthForInt(date);
        //确保输出两位
        return month < 10 ? "0" + month : "" + month;
    }

    /**
     * 输入date返回int类型的date的日
     *
     * @param date 输入的date数据
     * @return date的日期
     */
    public static int getDayForInt(Date date) {
        if (date == null) {
            throw new IllegalArgumentException("date不能为null");
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.DATE);
    }

    /**
     * 输入date返回int类型的date的日期
     *
     * @param date 输入的date数据
     * @return date的日期
     */
    public static String getDayForString(Date date) {
        return String.valueOf(getDayForInt(date));
    }

    /**
     * 输入一个date类型日期返回是否是周末
     *
     * @param date 输入的date数据
     * @return 是否是周末
     */
    public static boolean isWeekend(Date date) {
        if (date == null) {
            throw new IllegalArgumentException("date不能为null");
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;
        return dayOfWeek == 0 || dayOfWeek == 6;
    }

    /**
     * 输入两个date类型的数据,判断他们是不是同一天
     *
     * @param date1 第一个date
     * @param date2 第二个date
     * @return 是否同一天
     */
    public static boolean isSameDay(Date date1, Date date2) {
        if (date1 == null || date2 == null) {
            throw new IllegalArgumentException("The date must not be null");
        }
        Calendar calendar1 = Calendar.getInstance();
        calendar1.setTime(date1);
        Calendar calendar2 = Calendar.getInstance();
        calendar2.setTime(date2);
        return (calendar1.get(Calendar.ERA) == calendar2.get(Calendar.ERA) &&
                calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR) &&
                calendar1.get(Calendar.DAY_OF_YEAR) == calendar2.get(Calendar.DAY_OF_YEAR));
    }

    /**
     * 输入两个date类型的数据,判断他们是不是同一个月
     *
     * @param date1 第一个date
     * @param date2 第二个date
     * @return 是否同一天
     */
    public static boolean isSameMonth(Date date1, Date date2) {
        if (date1 == null || date2 == null) {
            throw new IllegalArgumentException("The date must not be null");
        }
        Calendar calendar1 = Calendar.getInstance();
        calendar1.setTime(date1);
        Calendar calendar2 = Calendar.getInstance();
        calendar2.setTime(date2);
        return (calendar1.get(Calendar.ERA) == calendar2.get(Calendar.ERA) &&
                calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR) &&
                calendar1.get(Calendar.MONTH) == calendar2.get(Calendar.MONTH));
    }

    /**
     * 获取上个月最后一天的日期
     *
     * @return
     */
    public static Date getLastDayOfLastMonth() {
        Date curMonthFirstDay = org.apache.commons.lang3.time.DateUtils.truncate(new Date(), Calendar.MONTH);
        return addDays(curMonthFirstDay, -1);
    }

    /**
     * 获取下个月第一天的日期(默认00:00:00)
     *
     * @return
     */
    public static Date getFirstDayOfNextMonth() {
        return org.apache.commons.lang3.time.DateUtils.ceiling(new Date(), Calendar.MONTH);
    }

    /**
     * 获取上个月最后一天最后一秒的日期(到23:59:59)
     *
     * @return
     */
    public static Date getLastSecondsOfLastMonth() {
        Date curMonthFirstDay = org.apache.commons.lang3.time.DateUtils.truncate(new Date(), Calendar.MONTH);
        return addSeconds(curMonthFirstDay, -1);
    }
}

功能的话由于注释比较详细应该都能看懂,后续准备完成一个Java8提供的新的时间类LocalDateTime的相关操作的工具类

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值