Java日期函数DateUtil

package com.endless.utils;

import org.apache.commons.lang3.StringUtils;

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

public class DateUtil {
    private static final long DAYTIME_MILLISECONDS = 86400000L;
    public static final String SDF_YYYY_MM_DD_HH_MM = "yyyy-MM-dd HH:mm";
    public static final String SDF_YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
    public static final String SDF_YYYY_MM_DD = "yyyy-MM-dd";
    public static final String SDF_HH_MM = "HH:mm";
    public static final String SDF_YYYY = "yyyy";
    public static final String SDF_YYYY_DOT_M_DOT_D = "yyyy.M.d";
    public static final String SDF_YYYY_DOT_MM = "yyyy.MM";
    public static final String SDF_YYYY_MM_DD_AT_HH_MM_SS = "yyyy-MM-dd@HH:mm:ss";

    /**
     * 字符串转换成日期
     *
     * @param date    字符串
     * @param pattern 格式
     */
    public static Date string2Date(String date, String pattern) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        return sdf.parse(date);
    }

    /**
     * 字符串转换成日期
     *
     * @param date 以yyyy-MM-dd HH:mm:ss的pattern进行转换
     */
    public static Date string2Date(String date) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat(SDF_YYYY_MM_DD_HH_MM_SS);
        return sdf.parse(date);
    }

    /**
     * 将日期转换为字符串
     *
     * @param date    日期
     * @param pattern 转化的格式,如yyyy-MM-dd HH:mm:ss
     */
    public static String date2String(Date date, String pattern) {
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        return sdf.format(date);
    }

    /**
     * 将日期转换为字符串
     *
     * @param date 默认转化为yyyy-MM-dd HH:mm:ss
     */
    public static String date2String(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat(SDF_YYYY_MM_DD_HH_MM_SS);
        return sdf.format(date);
    }

    /**
     * 将传入的日期向前(或向后)滚动|amount|年
     *
     * @param date   日期
     * @param amount 天数
     */
    public static Date rollByYear(Date date, int amount) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.YEAR, amount);
        return calendar.getTime();
    }

    public static Date rollByYear(int amount) {
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.YEAR, amount);
        return calendar.getTime();
    }

    /**
     * 将传入的日期向前(或向后)滚动|amount|月
     *
     * @param date   日期
     * @param amount 天数
     */
    public static Date rollByMonth(Date date, int amount) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.MONTH, amount);
        return calendar.getTime();
    }

    /**
     * 将传入的日期向前(或向后)滚动|amount|月
     *
     * @param date   日期
     * @param amount 天数
     */
    public static long rollByMonths(Date date, int amount) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.MONTH, amount);
        return calendar.getTimeInMillis();
    }

    /**
     * 将传入的日期向前(或向后)滚动|amount|天
     *
     * @param date   日期
     * @param amount 天数
     */
    public static long rollByDay(Date date, int amount) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DAY_OF_YEAR, amount);
        return calendar.getTimeInMillis();
    }

    /**
     * 得到几天前/后的时间
     *
     * @param date   日期
     * @param amount 天数
     */
    public static Date rollByDays(Date date, int amount) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DAY_OF_YEAR, amount);
        return calendar.getTime();
    }

    public static Date rollByMinutes(Date date, int amount) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.MINUTE, amount);
        return calendar.getTime();
    }

    /**
     * 获取 amount 分钟的前后时间
     *
     * @param date   日期
     * @param amount 天数
     */
    public static Date rollBySeconds(Date date, int amount) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.SECOND, amount);
        return calendar.getTime();
    }

    public static boolean isBefore(Date date, Date date1) {
        return date1.before(date);
    }

    /**
     * 得到几小时前/后的时间
     *
     * @param date   日期
     * @param amount 天数
     */
    public static Date rollByHour(Date date, int amount) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.HOUR_OF_DAY, amount);
        return calendar.getTime();
    }

    /**
     * 得到当下date
     */
    public static Date getNowDate() {
        return new Date();
    }

    /**
     * 获取当天零点时间
     */
    public static Date getCurrentZeroTime() {
        Calendar c = Calendar.getInstance();
        c.setTime(new Date());
        c.set(Calendar.HOUR_OF_DAY, 0);
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);
        c.set(Calendar.MILLISECOND, 0);
        return c.getTime();
    }

    /**
     * 得到日期字符串
     *
     * @param date 日期
     * @return 日期字符串
     */
    public static String getDateFromTime(Date date) {
        SimpleDateFormat sdf_date = new SimpleDateFormat(SDF_YYYY_MM_DD);
        return sdf_date.format(date);
    }


    /**
     * 计算两个日期的相差天数
     * 注:只计算日期的差值,不精确到小时;结果可以有负值
     *
     * @param fromDate 起始日期
     * @param endDate  结束日期
     */
    public static int differDate(Date fromDate, Date endDate) throws ParseException {
        return differDate(date2String(fromDate, SDF_YYYY_MM_DD),
                date2String(endDate, SDF_YYYY_MM_DD));
    }

    /**
     * 计算两个日期的相差天数 (2014-10-01 到 2014-10-07  为 7天)
     * 注:只计算日期的差值,不精确到小时;结果可以有负值
     *
     * @param fromDate 形如yyyy-MM-dd
     * @param endDate  形如yyyy-MM-dd
     */
    public static int differDate(String fromDate, String endDate) throws ParseException {
        Date fDate = string2Date(fromDate, SDF_YYYY_MM_DD);
        Date eDate = string2Date(endDate, SDF_YYYY_MM_DD);
        int cha = calculateDiffDay(fDate, eDate);
        return cha >= 0 ? (cha + 1) : (cha - 1);
    }

    private static int calculateDiffDay(Date fDate, Date eDate) {
        long cha = eDate.getTime() - fDate.getTime();
        return (int) (cha / DAYTIME_MILLISECONDS);
    }


    public static boolean compete(String startDate, String endDate, String formatStr) {
        if (StringUtils.isBlank(startDate) || StringUtils.isBlank(endDate)
                || StringUtils.isBlank(formatStr)) {
            return false;
        }
        SimpleDateFormat format = new SimpleDateFormat(formatStr);
        try {
            Date sDate = format.parse(startDate);
            if (endDate.contains("至今")) {
                Calendar calendar = Calendar.getInstance();
                if (formatStr.equals("yyyy")) {
                    endDate = calendar.get(Calendar.YEAR) + "";
                } else if (formatStr.equals("yyyy.MM")) {
                    endDate = calendar.get(Calendar.YEAR) + "."
                            + (calendar.get(Calendar.MONTH) + 1);
                }
            }
            Date eDate = format.parse(endDate);
            if (eDate.getTime() >= sDate.getTime()) {
                return true;
            }
        } catch (ParseException e) {
            return false;
        }
        return false;

    }

    public static String getDate(Date date, String formatStr) {
        SimpleDateFormat format = new SimpleDateFormat(formatStr);
        return date != null ? format.format(date) : "";
    }

    /**
     * 将日期格式的字符串转换为长整型
     *
     * @param date   日期
     * @param format 格式
     */
    public static long convert2long(String date, String format) {
        try {
            if (format == null || "".equals(format))
                format = "yyyy-MM-dd HH:mm:ss";
            SimpleDateFormat sf = new SimpleDateFormat(format);
            return sf.parse(date).getTime();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return 0l;
    }


    /**
     * 时间计算
     *
     * @param year  年
     * @param month 月
     * @param day   日
     * @param hour  时
     * @param min   分
     * @param sec   秒
     * @return 日期
     */
    public static Date calcDate(int year, int month, int day, int hour, int min, int sec) {
        Calendar cal = Calendar.getInstance();
        year = cal.get(Calendar.YEAR) + year;
        month = cal.get(Calendar.MONTH) + month;
        day = cal.get(Calendar.DATE) + day;
        hour = cal.get(Calendar.HOUR_OF_DAY) + hour;
        min = cal.get(Calendar.MINUTE) + min;
        sec = cal.get(Calendar.SECOND) + sec;
        cal.set(year, month, day, hour, min, sec);
        return cal.getTime();
    }

    /**
     * 时间计算
     *
     * @param year  年
     * @param month 月
     * @param day   日
     * @param hour  时
     * @param min   分
     * @param sec   秒
     * @return 日期
     */
    public static String calcDate(int year, int month, int day, int hour, int min, int sec,
                                  String format) {
        Calendar cal = Calendar.getInstance();
        year = cal.get(Calendar.YEAR) + year;
        month = cal.get(Calendar.MONTH) + month;
        day = cal.get(Calendar.DATE) + day;
        hour = cal.get(Calendar.HOUR_OF_DAY) + hour;
        min = cal.get(Calendar.MINUTE) + min;
        sec = cal.get(Calendar.SECOND) + sec;
        cal.set(year, month, day, hour, min, sec);
        Date date = cal.getTime();
        return date2String(date, format);
    }

    /**
     * 计算相差天数
     */
    public static int calcDate(String endDate, String startDate, String format) {
        SimpleDateFormat formatter = new SimpleDateFormat(format);
        try {
            long t = formatter.parse(endDate).getTime() - formatter.parse(startDate).getTime();
            return new Long((t / (1000 * 24 * 60 * 60))).intValue();
        } catch (ParseException e) {
            return 0;
        }
    }

    /**
     * @param dateStr 计算dateStr与days之和
     * @param days    天数
     * @param format  格式
     */
    public static String calcDate(String dateStr, int days, String format) {
        SimpleDateFormat formatter = new SimpleDateFormat(format);
        try {
            long time = formatter.parse(dateStr).getTime();
            long t = time + (long) days * 1000 * 24 * 60 * 60;

            Date d = new Date(t);
            return formatter.format(d);
        } catch (ParseException e) {
            e.printStackTrace();
            return dateStr;
        }
    }

    /**
     * 计算与当前时间相差天数
     */
    public static int calcDays(String date, String format) {
        if (date == null) {
            return 5;
        }
        SimpleDateFormat formatter = new SimpleDateFormat(format);
        //开始结束相差天数
        try {
            return new Long((System.currentTimeMillis() - formatter.parse(date).getTime())
                    / (1000 * 24 * 60 * 60)).intValue();
        } catch (ParseException e) {
            e.printStackTrace();
            return 5;
        }
    }

    /**
     * 格式化页面时间显示
     *
     * @param deliverTime 时间字符串
     * @param fmtStr      格式
     */
    public static String formatShowTime(String deliverTime, String fmtStr) {
        SimpleDateFormat sFmt = new SimpleDateFormat(SDF_YYYY_MM_DD_HH_MM_SS);
        Date date = null;
        try {
            date = sFmt.parse(deliverTime);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return formatShowTime(date, fmtStr);

    }

    /**
     * 格式化页面时间显示
     *
     * @param deliverTime 时间
     * @param fmtStr      格式
     */
    public static String formatShowTime(Date deliverTime, String fmtStr) {
        try {
            SimpleDateFormat fmt = new SimpleDateFormat(fmtStr);
            return fmt.format(deliverTime);
        } catch (Exception e) {
            return StringUtils.EMPTY;
        }

    }

    /**
     * 时间计算
     *
     * @param year  年
     * @param month 月
     * @param day   日
     * @param hour  时
     * @param min   分
     * @param sec   秒
     */
    public static String calcDate(Date date, int year, int month, int day, int hour, int min,
                                  int sec, String format) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        year = cal.get(Calendar.YEAR) + year;
        month = cal.get(Calendar.MONTH) + month;
        day = cal.get(Calendar.DATE) + day;
        hour = cal.get(Calendar.HOUR_OF_DAY) + hour;
        min = cal.get(Calendar.MINUTE) + min;
        sec = cal.get(Calendar.SECOND) + sec;
        cal.set(year, month, day, hour, min, sec);
        Date resultDate = cal.getTime();
        return date2String(resultDate, format);
    }

    /**
     * 得到今夕是何年
     *
     * @return 形如 yyyy
     */
    public static String getYear() {
        return date2String(new Date(), SDF_YYYY);
    }

    /**
     * 得到今夕是何年
     *
     * @return 形如 yyyy
     */
    public static int getYear(Date date) {
        return Integer.parseInt(date2String(date, SDF_YYYY));
    }

    public static long getSecond(Date begin, Date end) {
        return (end.getTime() - begin.getTime()) / 1000;
    }

    public static long getMillisecond(Date begin, Date end) {
        return (end.getTime() - begin.getTime());
    }

    /**
     * 计算当前年份,并和传入值比较
     */
    public static int calCurrentYear(String year, String format) {
        SimpleDateFormat fmt = new SimpleDateFormat(format);
        Date now = new Date();
        String currentYear = fmt.format(now);
        return year.compareTo(currentYear);
    }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值