java操作日期的相关工具类,拿去即用

日期工具类
1.获取当前Date型日期
2. 获取当前日期, 默认格式为yyyy-MM-dd
3. 日期路径 即年/月/日 如2018/08/08
4. 日期路径 即年/月/日 如20180808
5. 日期型字符串转化为日期 格式
6. 获取服务器启动时间
7. 计算两个时间差
8. 两个日期相差年或者月 1 :年 , 2 :月
9. 日期相加(日期+年)
10.日期相加(日期+月)
11.特定天数
12.时间段是否重叠
13.秒转成时分秒
14.LocalDate转Date
15. 获取某区间段内的所有日期
16. 获取该月的第一天
17. 获取该月的最后一天
18.获取时间段内的月份
19.获取两个时间相差秒数
20.字符串 转 日期
21.判断时间是否在时间段内
22.生成指定年的每一天
23.判断是否是今年
24.获取本周第一天和最后一天
25.获取今天时间开始和结束
26.获取本月时间开始和结束
27.获取指定日期 几天前的时间
28.获取指定日期的0点和24点
29.获取30天以前的时间
30.根据年月获取对应的月份天数

package com.ngs.common.utils;

import java.lang.management.ManagementFactory;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.apache.commons.lang3.time.DateFormatUtils;

/**
 * 时间工具类
 * @author Wik6
 */
public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
    public static String YYYY = "yyyy";

    public static String YYYY_MM = "yyyy-MM";

    public static String YYYY_MM_DD = "yyyy-MM-dd";

    public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";

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

    private static String[] parsePatterns = {
            "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
            "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
            "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};

    /**
     * 获取当前Date型日期
     *
     * @return Date() 当前日期
     */
    public static Date getNowDate() {
        return new Date();
    }

    /**
     * 获取当前日期, 默认格式为yyyy-MM-dd
     *
     * @return String
     */
    public static String getDate() {
        return dateTimeNow(YYYY_MM_DD);
    }

    public static final String getTime() {
        return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
    }

    public static final String dateTimeNow() {
        return dateTimeNow(YYYYMMDDHHMMSS);
    }

    public static final String dateTimeNow(final String format) {
        return parseDateToStr(format, new Date());
    }

    public static final String dateTime(final Date date) {
        return parseDateToStr(YYYY_MM_DD, date);
    }

    public static final String parseDateToStr(final String format, final Date date) {
        return new SimpleDateFormat(format).format(date);
    }

    public static final Date dateTime(final String format, final String ts) {
        try {
            return new SimpleDateFormat(format).parse(ts);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 日期路径 即年/月/日 如2018/08/08
     */
    public static final String datePath() {
        Date now = new Date();
        return DateFormatUtils.format(now, "yyyy/MM/dd");
    }

    /**
     * 日期路径 即年/月/日 如20180808
     */
    public static final String dateTime() {
        Date now = new Date();
        return DateFormatUtils.format(now, "yyyyMMdd");
    }

    /**
     * 日期型字符串转化为日期 格式
     */
    public static Date parseDate(Object str) {
        if (str == null) {
            return null;
        }
        try {
            return parseDate(str.toString(), parsePatterns);
        } catch (ParseException e) {
            return null;
        }
    }

    /**
     * 获取服务器启动时间
     */
    public static Date getServerStartDate() {
        long time = ManagementFactory.getRuntimeMXBean().getStartTime();
        return new Date(time);
    }

    /**
     * 计算两个时间差
     */
    public static String getDatePoor(Date endDate, Date nowDate) {
        long nd = 1000 * 24 * 60 * 60;
        long nh = 1000 * 60 * 60;
        long nm = 1000 * 60;
        // long ns = 1000;
        // 获得两个时间的毫秒时间差异
        long diff = endDate.getTime() - nowDate.getTime();
        // 计算差多少天
        long day = diff / nd;
        // 计算差多少小时
        long hour = diff % nd / nh;
        // 计算差多少分钟
        long min = diff % nd % nh / nm;
        // 计算差多少秒//输出结果
        // long sec = diff % nd % nh % nm / ns;
        return day + "天" + hour + "小时" + min + "分钟";
    }
    
 //两个日期相差年或者月 1 :年 , 2 :月
    public static int getMonthNum(String date1, String date2, int type) throws java.text.ParseException {
        int result = 0;
        SimpleDateFormat sdf = new SimpleDateFormat(type == 1 ? "yyyy" : "yyyy-MM");

        Calendar c1 = Calendar.getInstance();
        Calendar c2 = Calendar.getInstance();

        c1.setTime(sdf.parse(date1));
        c2.setTime(sdf.parse(date2));

        if (type == 1) {
            result = c2.get(Calendar.YEAR) - c1.get(Calendar.YEAR);
            System.out.println("日期:" + date1 + "|" + date2 + "|,相差" + Math.abs(result) + "年");
            return result;
        } else {
            result = c2.get(Calendar.MONTH) - c1.get(Calendar.MONTH);
            int month = (c2.get(Calendar.YEAR) - c1.get(Calendar.YEAR)) * 12;
            log.info("|到期时间:" + date2 + "减去现在日期:" + date1 + "|,剩余" + (month + result) + "个月");
            return  month + result;
        }
    }
 //日期相加(日期+年)
    public String addDate(String date, int year) throws ParseException {
        //格式化日期的对象(转化成习惯的时间格式)
        SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy-MM-dd");
        //静态方法getInstance()使用默认时区和语言环境获得一个日历。
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(sdFormat.parse(date));
        calendar.add(Calendar.YEAR, year);
        String format = sdFormat.format(calendar.getTime());

        return format;
    }
    //日期相加(日期+月)
    public String addDate(String date, int mouth) throws ParseException {
        //格式化日期的对象(转化成习惯的时间格式)
        SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy-MM-dd");
        //静态方法getInstance()使用默认时区和语言环境获得一个日历。
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(sdFormat.parse(date));
        calendar.add(Calendar.MOUTH, mouth);
        String format = sdFormat.format(calendar.getTime());
        return format;
    }





    /**
     * 特定天数
     *
     * @throws Exception
     */
    public static long getDays(String str, String endt) throws Exception {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date strD = simpleDateFormat.parse(str);
        Date endtD = simpleDateFormat.parse(endt);
        long day = endtD.getTime() - strD.getTime();
        long l = day / (24 * 3600 * 1000);
        return l;
    }


    //时间段是否重叠
    public static boolean isOverlap(List<Date> startList, List<Date> endList) throws ParseException {
        //造3个时间段数据
        List<Timestamp> periodStart = new ArrayList<Timestamp>();
        List<Timestamp> periodend = new ArrayList<Timestamp>();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //开始时间放到一个数组
        startList.stream().forEach(x -> {
            periodStart.add(new Timestamp(x.getTime()));
        });
        //结束时间放到一个数组
        endList.stream().forEach(x -> {
            periodend.add(new Timestamp(x.getTime()));
        });
        /**
         * 两两循环比较
         * 这里的3代表有三组数据,先写死
         */
        for (int i = 0; i < periodStart.size() - 1; i++) {
            Timestamp start0 = periodStart.get(i);
            Timestamp end0 = periodend.get(i);
            for (int j = i + 1; j < periodStart.size(); j++) {
                Timestamp start = periodStart.get(j);
                Timestamp end = periodend.get(j);
                if (start0.compareTo(end) >= 0 || end0.compareTo(start) <= 0) {
                    /**
                     * 说明不重复。
                     * 思路:该时间段的开始时间如何大于另个一个时间段的结束时间,那么这个两个时间段不会有重叠;
                     * 如果该时间段的结束时间小于另一个时间段的时间,那么这个两个时间段也不会有重叠。
                     */
                    continue;
                } else {
                    //说明该时间段重复
                    return true;
                }
            }
        }

        return false;
    }

    /**
     * 秒转成时分秒
     *
     * @param second 秒数
     * @return 时分秒
     */
    public static String getFormatTime(Long second) {
        if (second != null) {
            String num0 = NumFormat(0);
            if (second < 60) {//秒
                return num0 + ":" + num0 + ":" + NumFormat(second);
            }
            if (second < 3600) {//分
                return num0 + ":" + NumFormat(second / 60) + ":" + NumFormat(second % 60);
            }
            if (second < 3600 * 24) {//时
                return NumFormat(second / 60 / 60) + ":" + NumFormat(second / 60 % 60) + ":" + NumFormat(second % 60);
            }
            if (second >= 3600 * 24) {//天
                return NumFormat(second / 60 / 60 / 24) + "天" + NumFormat(second / 60 / 60 % 24) + ":" + NumFormat(second / 60 % 60) + ":" + NumFormat(second % 60);
            }
        }
        return "--";
    }


    /**
     * LocalDate转Date
     *
     * @param localDate localDate
     * @return Date
     */
    public static Date LocalDate2Date(LocalDate localDate) {
        ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.systemDefault());
        return Date.from(zonedDateTime.toInstant());
    }

    /**
     * 获取某区间段内的所有日期
     *
     * @param startTime 2020-09-9
     * @param endTime   2020-09-11
     * @return 2020-09-9 2020-09-10 2020-09-11
     */
    public static List<String> findDates(Date startTime, Date endTime) throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        List<String> result = new ArrayList<>();
        Calendar calBegin = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calBegin.setTime(startTime);
        Calendar calEnd = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calEnd.setTime(endTime);
        // 此日期是否在指定日期之后
        while (endTime.after(calBegin.getTime())) {
            result.add(sdf.format(calBegin.getTime()));
            calBegin.add(Calendar.DAY_OF_MONTH, 1);
        }
        result.add(sdf.format(calEnd.getTime()));
        return result;
    }

    /**
     * 获取该月的第一天
     *
     * @param year  年
     * @param month 月
     * @return
     */
    public static Date getFirstDay(int year, int month) {
        Calendar c = Calendar.getInstance();
        c.set(Calendar.YEAR, year);
        // 设置月份,因为月份从0开始,所以用month - 1
        c.set(Calendar.MONTH, month - 1);
        c.set(Calendar.DAY_OF_MONTH, 1);
        Date time = c.getTime();
        SimpleDateFormat slf = new SimpleDateFormat("yyyy-MM-dd");
        String format = slf.format(time);
        try {
            return slf.parse(format);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取该月的最后一天
     */
    public static Date getLastDay ( int year, int month){
        Calendar c = Calendar.getInstance();
        c.set(Calendar.YEAR, year);
        // 设置月份,因为月份从0开始,所以用month - 1
        c.set(Calendar.MONTH, month - 1);
        // 获取当前时间下,该月的最大日期的数字
        int lastDay = c.getActualMaximum(Calendar.DAY_OF_MONTH);
        // 将获取的最大日期数设置为Calendar实例的日期数
        c.set(Calendar.DAY_OF_MONTH, lastDay);
        Date time = c.getTime();
        SimpleDateFormat slf = new SimpleDateFormat("yyyy-MM-dd");
        String format = slf.format(time);
        try {
            return slf.parse(format);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取时间段内的月份
     */
    public static List<String> getMonthBetween(String minDate, String maxDate){
        ArrayList<String> result = new ArrayList<>();
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");//格式化为年月

            Calendar min = Calendar.getInstance();
            Calendar max = Calendar.getInstance();
            min.setTime(sdf.parse(minDate));
            min.set(min.get(Calendar.YEAR), min.get(Calendar.MONTH), 1);

            max.setTime(sdf.parse(maxDate));
            max.set(max.get(Calendar.YEAR), max.get(Calendar.MONTH), 2);

            while (min.before(max)) {
                result.add(sdf.format(min.getTime()));
                min.add(Calendar.MONTH, 1);
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }

        return result;
    }
    

    /*
    * 获取两个时间相差秒数
    *
    * */
    public  static long getTimeDelta(Date startDate,Date endDate) {
        long a = endDate.getTime();
        long b = startDate.getTime();
        long c =((a - b) / 1000);
        return c;
    }

    // 字符串 转 日期
    public static Date strToDate(String str) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = sdf.parse(str);
        } catch (ParseException e) {
        }
        return date;
    }


    /**
     * 判断时间是否在时间段内
     *
     * @param nowTime
     * @param beginTime
     * @param endTime
     * @return
     */
    public static boolean belongCalendar(Date nowTime, Date beginTime, Date endTime) {
        Calendar date = Calendar.getInstance();
        date.setTime(nowTime);
        Calendar begin = Calendar.getInstance();
        begin.setTime(beginTime);
        Calendar end = Calendar.getInstance();
        end.setTime(endTime);
        if (date.after(begin) && date.before(end)) {
            return true;
        } else if (nowTime.compareTo(beginTime) == 0 ) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 生成指定年的每一天
     * @param year
     * @return
     */
    public static List<String> getDaysByYear(int year){
        Calendar c=Calendar.getInstance();
        List<String> dates=new ArrayList<String>();
        for(int i=0;i<12;i++){
            c.set(year,i,1);
            int lastDay=c.getActualMaximum(Calendar.DATE);
            for(int j=1;j<=lastDay;j++){
                String month="";
                String day="";
                if(i<9) month="-0"+(i+1);
                else month="-"+(i+1);
                if(j<10) day="-0"+j;
                else day="-"+j;
                String date=year+month+day;
                dates.add(date);
            }
        }
        return dates;
    }
    //判断是否是今年
    public static boolean isNowYear(int year){
        Calendar date = Calendar.getInstance();
        String years = String.valueOf(date.get(Calendar.YEAR));
        return years.equals(year + "");
    }
    
        public static String beforeDate(int day) {
        Calendar now = Calendar.getInstance();
        now.add(Calendar.DAY_OF_MONTH, -day);
        String endDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(now.getTime());
        return endDate;
    }
    private static String NumFormat(long sec) {
        if (String.valueOf(sec).length() < 2) {
            return "0" + sec;
        } else {
            return String.valueOf(sec);
        }
    }
    //获取今年后两位
    private static String yearLast() {
        String yearLast = new SimpleDateFormat("yy", Locale.CHINESE).format(Calendar.getInstance().getTime());
        return yearLast;
    }
        public static String mixTimeStr(String endTime) {
        Calendar rCalendar = Calendar.getInstance();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = null;
        try {
            date = simpleDateFormat.parse(endTime);
        } catch (Exception e) {
            e.printStackTrace();
        }
        rCalendar.setTime(date);//里面的date换成自己的时间字段
        rCalendar.add(Calendar.HOUR, 23);
        rCalendar.add(Calendar.MINUTE, 59);
        rCalendar.add(Calendar.SECOND, 59);
        return simpleDateFormat.format(rCalendar.getTime());
    }
 /**
     * 获取本周的第一天
     * @return String
     * **/
    public static String getWeekStart(){
        Calendar cal=Calendar.getInstance();
        cal.add(Calendar.WEEK_OF_MONTH, 0);
        cal.set(Calendar.DAY_OF_WEEK, 2);
        Date time=cal.getTime();
        return new SimpleDateFormat("yyyy-MM-dd").format(time)+" 00:00:00";
    }
    /**
     * 获取本周的最后一天
     * @return String
     * **/
    public static String getWeekEnd(){
        Calendar cal=Calendar.getInstance();
        cal.set(Calendar.DAY_OF_WEEK, cal.getActualMaximum(Calendar.DAY_OF_WEEK));
        cal.add(Calendar.DAY_OF_WEEK, 1);
        Date time=cal.getTime();
        return new SimpleDateFormat("yyyy-MM-dd").format(time)+" 23:59:59";
    }
 //获取今天 00.00
    public static Date getStartTime() {
        Calendar todayStart = Calendar.getInstance();
        todayStart.set(Calendar.HOUR, 0);
        todayStart.set(Calendar.MINUTE, 0);
        todayStart.set(Calendar.SECOND, 0);
        todayStart.set(Calendar.MILLISECOND, 0);
        return todayStart.getTime();
    }

    //获取今天 23.59
    public static Date getEndTime() {
        Calendar todayEnd = Calendar.getInstance();
        todayEnd.set(Calendar.HOUR, 23);
        todayEnd.set(Calendar.MINUTE, 59);
        todayEnd.set(Calendar.SECOND, 59);
        todayEnd.set(Calendar.MILLISECOND, 999);
        return todayEnd.getTime();
    }

    // 获得本月第一天0点时间
    public static Date getTimesMonthmorning() {
        Calendar cal = Calendar.getInstance();
        cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH));
        return cal.getTime();
    }

    // 获得本月最后一天24点时间
    public static Date getTimesMonthnight() {
        Calendar cal = Calendar.getInstance();
        cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
        cal.set(Calendar.HOUR_OF_DAY, 24);
        return cal.getTime();
    }
//获取指定日期  几天前的时间
    public Date getDateAfter(Date d, int day) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Calendar now = Calendar.getInstance();
        now.setTime(d);
        now.set(Calendar.DATE, now.get(Calendar.DATE) - day);//+后 -前
        return now.getTime();
    }
     // 返回时间格式如:2020-02-17 00:00:00
    public static String getStartOfDay(Date time) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(time);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime());
    }
    // 返回时间格式如:2020-02-19 23:59:59
    public static String getEndOfDay(Date time) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(time);
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        calendar.set(Calendar.MILLISECOND, 999);
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime());
    }
    // 获取30天以前的时间
    public static String getThirtyDaysAgo(Date time) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(time);
        calendar.add(calendar.DATE, -30);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime());
    }

/**

* 根据年 月 获取对应的月份 天数

*/

public static int getDaysByYearMonth(int year, int month) {
Calendar a = Calendar.getInstance();

a.set(Calendar.YEAR, year);

a.set(Calendar.MONTH, month - 1);

a.set(Calendar.DATE, 1);

a.roll(Calendar.DATE, -1);

int maxDate = a.get(Calendar.DATE);

return maxDate;

}

    



}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值