首页 > 代码库 > DateConvertUtil 日期工具类

DateConvertUtil 日期工具类

package com.hxqc.basic.dependency.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;


public class DateConvertUtil {

    public static final String DATE_FORMAT = "yyyy-MM-dd";

    public static final String TIME_FORMAT = "HH:mm:ss";

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

    public static final String DATE_TIME_FORMAT_SHORT = "yyyy-MM-dd HH:mm";

    public static final String TIMESTATMP_FORMAT = "yyyy-MM-dd HH:mm:ss.S";

    public static SimpleDateFormat year_format = new SimpleDateFormat("yyyy");

    public static SimpleDateFormat default_format = new SimpleDateFormat(
            "yyyy-MM-dd");

    public static SimpleDateFormat common_format = new SimpleDateFormat(
            "yyyy-MM-dd HH:mm:ss");

    public static SimpleDateFormat time_format = new SimpleDateFormat(
            "yyyyMMddHHmmss");

    /**
     * 得到当前时间,返回long型
     *
     * @return String
     */
    public static long generateLongTime() {
        Date dt = new Date();
        return dt.getTime();
    }

    /**
     * 得到当前时间,格式为yyyyMMddhhmmss
     *
     * @return String
     */
    public static String generateTime() {
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
        return format.format(new Date());
    }

    /**
     * 根据格式生成当前日期时间
     *
     * @param formatStr
     * @return
     */
    public static String generateDateTime(String formatStr) {
        SimpleDateFormat format = new SimpleDateFormat(formatStr);
        return format.format(new Date());
    }

    public static String generateDateTimeAddHour(int addHour, String formatstr) {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.HOUR_OF_DAY, addHour);
        SimpleDateFormat format = new SimpleDateFormat(formatstr);
        return format.format(cal.getTime());
    }

    /**
     * 根据格式生成日期时间
     *
     * @param date
     * @param formatStr
     * @return
     */
    public static String generateDateTime(Date date, String formatStr) {
        SimpleDateFormat format = new SimpleDateFormat(formatStr);
        return format.format(date);
    }

    /**
     * 根据yyyy-MM-dd得到月份
     *
     * @param dateString String
     * @return int
     */
    public static int getMonthFromDate(String dateString) {
        Date date = string2Date(dateString);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        //System.out.println("calendar.setTime::::" + (calendar.get(Calendar.WEEK_OF_YEAR)));
        return calendar.get(Calendar.MONTH) + 1;
    }

    /**
     * 根据yyyy-MM-dd得到月份
     *
     * @param dateString String
     * @return int
     */
    public static int getYearFromDate(String dateString) {
        Date date = string2Date(dateString);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        //  System.out.println("calendar.setTime::::" + (calendar.get(Calendar.WEEK_OF_YEAR)));
        return calendar.get(Calendar.YEAR);
    }

    /**
     * 得到指定年的所有天数
     *
     * @param year String
     * @return day int
     */
    public static int getDayFromYear(String year) {
        Date date;
        int day = 0;
        try {
            date = year_format.parse(year);
            Calendar calendar = new GregorianCalendar();
            calendar.setTime(date);
            day = calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
        } catch (ParseException e) {

        }
        return day;
    }

    /**
     * 返回下一年_格式yyyy
     *
     * @return int
     */
    public static int getNextYear() {
        return new GregorianCalendar().get(Calendar.YEAR) + 1;
    }

    /**
     * 获取某年第一天日期_格式yyyy-MM-dd
     *
     * @param year 年份
     * @return String
     */
    public static String getCurrYearFirstDay(int year) {
        Calendar calendar = Calendar.getInstance();
        calendar.clear();
        calendar.set(Calendar.YEAR, year);
        Date currYearFirst = calendar.getTime();
        return default_format.format(currYearFirst);
    }

    /**
     * 根据一个日期,返回是星期几的数字_星期一:1....星期六:6,星期天:7, 注意:日期输错,不会报错,例如:2月30或31号
     *
     * @param date 日期值
     * @return int
     */
    public static int getWeek(Date date) {

        Calendar c = Calendar.getInstance();
        c.setTime(date);
        System.out.println("c.get(Calendar.DAY_OF_WEEK)::::"
                + c.get(Calendar.DAY_OF_WEEK));
        int iDay = 0;
        if (c.get(Calendar.DAY_OF_WEEK) == 1) {
            iDay = 7;
        } else {
            iDay = c.get(Calendar.DAY_OF_WEEK) - 1;
        }
        return iDay;
    }

    /**
     * 根据一个日期,返回是星期几的数字_星期一:1....星期六:6,星期天:7, 注意:日期输错,不会报错,例如:2月30或31号
     *
     * @param dateString String
     * @return int
     */
    public static int getWeek(String dateString) {
        Date date = string2Date(dateString);
        Calendar c = Calendar.getInstance();
        c.setTime(date);

        int iDay = 0;
        if (c.get(Calendar.DAY_OF_WEEK) == 1) {
            iDay = 7;
        } else {
            iDay = c.get(Calendar.DAY_OF_WEEK) - 1;
        }
        return iDay;
    }

    /**
     * 根据一个日期,传入指定天数,想要返回长度,得到String
     *
     * @param inDate 日期
     * @param days   天数
     * @param _iType inDate长度
     * @return String
     */
    public static String getDateByAddDays(String inDate, int days, int _iType) {
        Date dateStr = string2Date(inDate);
        Date tempDate = getDateByAddDays(dateStr, days);
        return date2String(tempDate, _iType);
    }

    /**
     * 根据Date日期,传入返回长度,得到String
     *
     * @param date   Date
     * @param _iType 返回String长度
     * @return String
     */
    public static String date2String(Date date, int _iType) {
        String strTemp = time_format.format(date);
        SimpleDateFormat formatter = null;
        switch (_iType) {
            case 0: // yyyymmdd
                strTemp = strTemp.substring(0, 8);
                break;
            case 4:// yyyy
                strTemp = strTemp.substring(0, 4);
                break;
            case 6: // yymmdd
                strTemp = strTemp.substring(2, 8);
                break;
            case 8: // yyyymmdd
                strTemp = strTemp.substring(0, 8);
                break;
            case 14:
                // yyyyMMddHHmmss 格式
                break;
            case 10: // yyyy-mm-dd
                formatter = new SimpleDateFormat("yyyy-MM-dd");
                strTemp = formatter.format(date);
                break;
            case 17:
                formatter = new SimpleDateFormat("yyyyMMddHHmmssSSS");
                strTemp = formatter.format(date);
                break;
            case 19: // yyyy-mm-dd HH:mm:ss
                formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                strTemp = formatter.format(date);
                break;
            case -6: // HHmmss
                strTemp = strTemp.substring(8);
                break;
            case -8: // HH:mm:ss
                formatter = new SimpleDateFormat("HH:mm:ss");
                strTemp = formatter.format(date);
                break;
            default:
                break;
        }
        return strTemp;
    }

    /**
     * 获得指定日期前后的日期,返回日期型值
     *
     * @param inDate 指定的日期
     * @param days   加减天数
     * @return Date
     */
    public static Date getDateByAddDays(Date inDate, int days) {
        GregorianCalendar calendar = new GregorianCalendar();
        calendar.setTime(inDate);
        calendar.add(Calendar.DATE, days);
        return calendar.getTime();
    }

    public static String getDateByAddDays(String formatStr, int days) {
        SimpleDateFormat format = new SimpleDateFormat(formatStr);
        GregorianCalendar calendar = new GregorianCalendar();
        calendar.setTime(new Date());
        calendar.add(Calendar.DATE, days);
        return format.format(calendar.getTime());
    }

    //日期加减
    public static String getDateSringByAddDays(String date, int days) {
        SimpleDateFormat format = new SimpleDateFormat(DATE_FORMAT);
        GregorianCalendar calendar = new GregorianCalendar();
        calendar.setTime(StringToDate(date, DATE_FORMAT));
        calendar.add(Calendar.DATE, days);
        return format.format(calendar.getTime());
    }


    //日期加减    isMonthStart=true:月初返回第一天   isMonthEnd=true:月末返回月最后一天
    public static String getDateSringByAddDays(String date, int days, boolean isMonthStart, boolean isMonthEnd) {
        if (DateConvertUtil.isMonthStart(date) && isMonthStart) {
            return date;
        }

        if (DateConvertUtil.isMonthEnd(date) && isMonthEnd) {
            return date;
        }
        SimpleDateFormat format = new SimpleDateFormat(DATE_FORMAT);
        GregorianCalendar calendar = new GregorianCalendar();
        calendar.setTime(StringToDate(date, DATE_FORMAT));
        calendar.add(Calendar.DATE, days);
        return format.format(calendar.getTime());
    }

    public static Date getDateByAddMinutes(Date inDate, int minutes) {
        GregorianCalendar calendar = new GregorianCalendar();
        calendar.setTime(inDate);
        calendar.add(Calendar.MINUTE, minutes);
        return calendar.getTime();
    }

    /**
     * 获得指定日期前后的日期,返回日期格式
     *
     * @param inDate 指定日期
     * @param month  加减月数
     * @return
     */
    public static Date getDateByAddMonth(Date inDate, int month) {
        GregorianCalendar calendar = new GregorianCalendar();
        calendar.setTime(inDate);
        calendar.add(Calendar.MONTH, month);
        return calendar.getTime();
    }

    /**
     * 当前日期的前后日期,返回字符串格式 yyyyMMddHHmmss
     *
     * @param month 加减月数
     * @return
     */
    public static String getCurrentByAddMonth(int month) {
        Date d = getDateByAddMonth(new Date(), month);

        return date2String(d, 14);
    }

    /**
     * 将日期字符串转换成日期型,日期格式为"yyyy-MM-dd"
     *
     * @param dateString 指定的日期字符串,格式为yyyyMMdd 或者yyyy-MM-dd
     * @return Date
     * @author lijunchen
     */
    public final static Date string2Date(String dateString) {
        if (dateString == null || dateString.trim().length() == 0) {
            return new Date(0);
        }

        // 处理不规范格式,例如:2013-1-2
        if (dateString.indexOf("-") > 0) {
            String month = dateString.substring(dateString.indexOf("-") + 1,
                    dateString.lastIndexOf("-"));
            if (month.length() == 1) {
                dateString = dateString.replace("-" + month + "-", "-0" + month
                        + "-");
            }
            String day = dateString.substring(dateString.lastIndexOf("-") + 1,
                    dateString.length());
            if (day.length() == 1) {
                dateString = dateString.substring(0,
                        dateString.lastIndexOf("-") + 1)
                        + "0" + day;
            }
            // System.out.println(dateString);
        }

        try {
            String strFormat = "";
            switch (dateString.length()) {
                case 4:
                    strFormat = "yyyy";
                    break;
                case 6: // yymmdd
                    strFormat = "yyMMdd";
                    break;
                case 8: // yyyymmdd
                    strFormat = "yyyyMMdd";
                    break;
                case 10: // yyyy-mm-dd
                    strFormat = "yyyy-MM-dd";
                    break;
                case 14:
                    strFormat = "yyyyMMddHHmmss";
                    break;
                default:
                    strFormat = "yyyy-MM-dd HH:mm:ss";
            }
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat(strFormat);
            // 这里没有做非法日期的判断,比如:"2007-05-33"
            java.util.Date timeDate = simpleDateFormat.parse(dateString);
            return timeDate;
        } catch (Exception e) {
            return new Date(0);
        }
    }

    /**
     * 得到两个时间的差值,单位是小时
     *
     * @param beginDate
     * @param endDate
     * @return
     */
    public static double getHourBetweenDates(Date beginDate, Date endDate) {

        long l1 = endDate.getTime();
        long l2 = beginDate.getTime();

        double cc = l1 - l2;
        return cc / (60 * 60 * 1000);
    }

    /**
     * 得到两个时间的差值,单位是分钟
     *
     * @param beginDate
     * @param endDate
     * @return
     */
    public static double getMinuteBetweenDates(Date beginDate, Date endDate) {

        double cc = endDate.getTime() - beginDate.getTime();
        return cc / (60 * 1000);
    }

    /**
     * 根据Date日期,传入返回长度,得到String
     *
     * @param date   Date
     * @param _iType 返回String长度
     * @return String
     */
    public static String longDate2String(long lDate, int _iType) {

        Date date = new Date(lDate);
        String strTemp = time_format.format(date);
        SimpleDateFormat formatter = null;
        switch (_iType) {
            case 0: // yyyymmdd
                strTemp = strTemp.substring(0, 8);
                break;
            case 4:// yyyy
                strTemp = strTemp.substring(0, 4);
                break;
            case 6: // yymmdd
                strTemp = strTemp.substring(2, 8);
                break;
            case 8: // yyyymmdd
                strTemp = strTemp.substring(0, 8);
                break;
            case 10: // yyyy-mm-dd
                formatter = new SimpleDateFormat("yyyy-MM-dd");
                strTemp = formatter.format(date);
                break;
            case -6: // HHmmss
                strTemp = strTemp.substring(8);
                break;
            case -8: // HH:mm:ss
                formatter = new SimpleDateFormat("HH:mm:ss");
                strTemp = formatter.format(date);
                break;
            default:
                break;
        }
        return strTemp;
    }

    public static int getDaysBetween(Date bDate, Date eDate) {
        Calendar d1 = new GregorianCalendar();
        d1.setTime(bDate);
        Calendar d2 = new GregorianCalendar();
        d2.setTime(eDate);
        int days = d2.get(Calendar.DAY_OF_YEAR) - d1.get(Calendar.DAY_OF_YEAR);
        int y2 = d2.get(Calendar.YEAR);
        if (d1.get(Calendar.YEAR) != y2) {
            d1 = (Calendar) d1.clone();
            do {
                days += d1.getActualMaximum(Calendar.DAY_OF_YEAR);// 得到当年的实际天数
                d1.add(Calendar.YEAR, 1);
            } while (d1.get(Calendar.YEAR) != y2);
        }
        return days;
    }

    /**
     * 返回本年份_格式yyyy
     *
     * @return int
     */
    public static int getCurrYear() {
        return new GregorianCalendar().get(Calendar.YEAR);
    }

    /**
     * 获得月份英文缩写
     *
     * @param sMonth String
     * @return String
     */
    public static String getMonthEnglishName(String sMonth) {

        String[] arrMonth = {"JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL",
                "AUG", "SEP", "OCT", "NOV", "DEC"};

        int iMonth = 0;
        String sRet = "";
        try {
            iMonth = Integer.parseInt(sMonth);
            if (iMonth >= 1 && iMonth <= 12) {
                sRet = arrMonth[iMonth - 1];
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return sRet;
    }

    public static Date StringToDate(String dateStr, String formatStr) {
        DateFormat dd = new SimpleDateFormat(formatStr);
        Date date = null;
        try {
            date = dd.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

    public static int getBetweenDayNumber(Date dateA, Date dateB) {
        long dayNumber = 0;
        // 1小时=60分钟=3600秒=3600000
        long mins = 60L * 1000L;
        // long day= 24L * 60L * 60L * 1000L;计算天数之差
        dayNumber = (dateB.getTime() - dateA.getTime()) / mins;
        return (int) dayNumber;
    }

    /**
     * 得到当前日期
     *
     * @return
     */
    public static String getCurrentDate() {
        Calendar c = Calendar.getInstance();
        Date date = c.getTime();
        SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd");
        return simple.format(date);
    }

    public static String getCurrentTime() {
        Calendar c = Calendar.getInstance();
        Date date = c.getTime();
        return common_format.format(date);
    }

    public static String getCron(Date date) {
        String dateFormat = "ss mm HH dd MM ? yyyy";
        return generateDateTime(date, dateFormat);
    }


    /**
     * 按照用户提供的日期格式化输出日期数据
     *
     * @param date
     * @param dateFormat
     * @return
     */
    public static String parseDateToString(Date date, String dateFormat) {
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        return sdf.format(date);
    }

    public static boolean isMonthEnd(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.DATE) == calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
    }

    public static boolean isMonthStart(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.DATE) == calendar.getActualMinimum(Calendar.DAY_OF_MONTH);
    }

    public static boolean isMonthEnd(String date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(StringToDate(date, "yyyy-MM-dd"));
        return calendar.get(Calendar.DATE) == calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
    }

    public static boolean isMonthStart(String date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(StringToDate(date, "yyyy-MM-dd"));
        return calendar.get(Calendar.DATE) == calendar.getActualMinimum(Calendar.DAY_OF_MONTH);
    }

    public static boolean isYearStart(String date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(StringToDate(date, "yyyy-MM-dd"));
        return calendar.get(Calendar.DAY_OF_YEAR) == calendar.getActualMinimum(Calendar.DAY_OF_YEAR);
    }


    /**
     * 获得去年最后一天
     *
     * @param String date
     */
    public static String get1YearBeforeLastDay(String date) {
        Calendar ca = Calendar.getInstance();
        ca.setTime(StringToDate(date, "yyyy-MM-dd"));
        ca.set(Calendar.YEAR, ca.get(Calendar.YEAR) - 1);
        ca.set(Calendar.MONTH, 11);
        ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
        return parseDateToString(ca.getTime(), "yyyy-MM-dd");
    }

    /**
     * 获得前年最后一天
     *
     * @param String date
     */
    public static String get2YearBeforeLastDay(String date) {
        Calendar ca = Calendar.getInstance();
        ca.setTime(StringToDate(date, "yyyy-MM-dd"));
        ca.set(Calendar.YEAR, ca.get(Calendar.YEAR) - 2);
        ca.set(Calendar.MONTH, 11);
        ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
        return parseDateToString(ca.getTime(), "yyyy-MM-dd");
    }

    /**
     * 获得上前年最后一天
     *
     * @param String date
     */
    public static String get3YearBeforeLastDay(String date) {
        Calendar ca = Calendar.getInstance();
        ca.setTime(StringToDate(date, "yyyy-MM-dd"));
        ca.set(Calendar.YEAR, ca.get(Calendar.YEAR) - 3);
        ca.set(Calendar.MONTH, 11);
        ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
        return parseDateToString(ca.getTime(), "yyyy-MM-dd");
    }

    /**
     * 获得去年同期
     *
     * @param String date
     */
    public static String getLastYearPeriod(String date) {
        Calendar ca = Calendar.getInstance();
        ca.setTime(StringToDate(date, "yyyy-MM-dd"));
        ca.add(Calendar.MONTH, -12);
        if (isMonthEnd(date)) {
            ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
        }
        return parseDateToString(ca.getTime(), "yyyy-MM-dd");
    }

    /**
     * 获得前年同期
     *
     * @param String date
     */
    public static String getLast2YearPeriod(String date) {
        Calendar ca = Calendar.getInstance();
        ca.setTime(StringToDate(date, "yyyy-MM-dd"));
        ca.add(Calendar.MONTH, -24);
        if (isMonthEnd(date)) {
            ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
        }
        return parseDateToString(ca.getTime(), "yyyy-MM-dd");
    }

    /**
     * 获得上月同期
     *
     * @param String date
     */
    public static String getLastMonthPeriod(String date) {
        Calendar ca = Calendar.getInstance();
        ca.setTime(StringToDate(date, "yyyy-MM-dd"));
        ca.add(Calendar.MONTH, -1);
        if (isMonthEnd(date)) {
            ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
        }
        return parseDateToString(ca.getTime(), "yyyy-MM-dd");
    }


    /**
     * 获得上上月同期(保险单车环比)
     *
     * @param String date
     */
    public static String getBeforeMonthPeriod(String date) {
        Calendar ca = Calendar.getInstance();
        ca.setTime(StringToDate(date, "yyyy-MM-dd"));
        ca.add(Calendar.MONTH, -2);
        if (isMonthEnd(date)) {
            ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
        }
        return parseDateToString(ca.getTime(), "yyyy-MM-dd");
    }

    /**
     * 获得上年月度同期
     *
     * @param String date
     */
    public static String getLastYearMonthPeriod(String date) {
        Calendar ca = Calendar.getInstance();
        ca.setTime(StringToDate(date, "yyyy-MM-dd"));
        ca.add(Calendar.YEAR, -1);
        if (isMonthEnd(date)) {
            ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
        }
        return parseDateToString(ca.getTime(), "yyyy-MM-dd");
    }

    /**
     * 获得某年某月最后一天
     *
     * @param String date
     */
    public static String getXYearXMonthLastDay(Integer year, Integer month) {
        Calendar ca = Calendar.getInstance();
        // ca.setTime(StringToDate(date, "yyyy-MM-dd"));
        ca.set(Calendar.YEAR, year);
        ca.set(Calendar.MONTH, month - 1);
        ca.set(Calendar.DAY_OF_MONTH, 1);
        ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
        return parseDateToString(ca.getTime(), "yyyy-MM-dd");
    }


    /**
     * 获得当年12个月的信息
     *
     * @param String date
     * @param flag   是否截止到当月
     */
    public static List<String> getCurrYearMonths(String date, boolean flag) {
        List<String> monthList = new ArrayList<String>();
        Calendar ca = Calendar.getInstance();
        ca.setTime(StringToDate(date, "yyyy-MM-dd"));
        int month = flag ? ca.get(Calendar.MONTH) + 1 : 12;
        int year = ca.get(Calendar.YEAR);
        for (int i = 0; i < month; i++) {
            ca = Calendar.getInstance();
            ca.set(Calendar.YEAR, year);
            ca.set(Calendar.MONTH, i);
            ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
            monthList.add(parseDateToString(ca.getTime(), "yyyy-MM-dd"));
        }
        return monthList;
    }

    /**
     * 获得当年12个月的信息
     *
     * @param String date
     * @param flag   是否截止到当月
     */
    public static List<String> get2YearMonths(String date, boolean flag) {
        List<String> monthList = new ArrayList<String>();
        Calendar ca = Calendar.getInstance();
        ca.setTime(StringToDate(date, "yyyy-MM-dd"));
        ca.add(Calendar.YEAR, -1);
        monthList.addAll(getCurrYearMonths(parseDateToString(ca.getTime(), "yyyy-MM-dd"), false));

        ca.add(Calendar.YEAR, 1);
        monthList.addAll(getCurrYearMonths(parseDateToString(ca.getTime(), "yyyy-MM-dd"), flag));
        return monthList;
    }

    /**
     * 获得当年有折扣的月分的信息
     * 折扣用
     *
     * @param String date
     */
    public static List<String> getCurrYearMonthsDis(String date) {
        List<String> monthList = new ArrayList<String>();
        Calendar ca = Calendar.getInstance();
        ca.setTime(StringToDate(date, "yyyy-MM"));
        int month = 0;
        if (TestLastDay(date)) {
            month = ca.get(Calendar.MONTH) + 1;
        } else {
            month = ca.get(Calendar.MONTH);
        }
        int year = ca.get(Calendar.YEAR);
        for (int i = 0; i < month; i++) {
            ca = Calendar.getInstance();
            ca.set(Calendar.YEAR, year);
            ca.set(Calendar.MONTH, i);
            ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
            monthList.add(parseDateToString(ca.getTime(), "yyyy-MM"));
        }
        return monthList;
    }

    /*
    * 将时间戳转换为时间
    */
    public static String stampToDate(Long s) {
        String res;
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        long lt = new Long(s);
        Date date = new Date(lt);
        res = simpleDateFormat.format(date);
        return res;
    }

    /**
     * 计算得到MongoDB存储的日期,(默认情况下mongo中存储的是标准的时间,中国时间是东八区,存在mongo中少8小时,所以增加8小时)
     *
     * @author: huyj
     * @date: 2017年3月8日 上午9:26:23
     * @param: @param
     * date
     * @return: Date
     */
    public static Date getMongoDate(Date date) {
        //SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:sss");
        Calendar ca = Calendar.getInstance();
        ca.setTime(date);
        ca.add(Calendar.HOUR_OF_DAY, 8);//StringToDate(,format)
        return ca.getTime();
        //return String2Date(sdf.format(ca.getTime()),"");
    }

    /**
     * 两个时间相差距离多少天多少小时多少分多少秒
     *
     * @param str1 时间参数 1 格式:1990-01-01 12:00:00
     * @param str2 时间参数 2 格式:2009-01-01 12:00:00
     * @return String 返回值为:xx天xx小时xx分xx秒
     */
    public static String getDistanceTime(String str1, String str2) {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date one;
        Date two;
        long day = 0;
        long hour = 0;
        long min = 0;
        long sec = 0;
        try {
            one = df.parse(str1);
            two = df.parse(str2);
            long time1 = one.getTime();
            long time2 = two.getTime();
            long diff;
            if (time1 < time2) {
                diff = time2 - time1;
            } else {
                diff = time1 - time2;
            }
            day = diff / (24 * 60 * 60 * 1000);
            hour = (diff / (60 * 60 * 1000) - day * 24);
            min = ((diff / (60 * 1000)) - day * 24 * 60 - hour * 60);
            sec = (diff / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        //return day + "天" + hour + "小时" + min + "分" + sec + "秒";
        return (day > 0 ? day + "天" : "")
                + (hour > 0 ? hour + "小时" : "")
                + (min > 0 ? min + "分" : "")
                + (sec > 0 ? sec + "秒" : "0秒");
    }

    /**
     * 两个时间相差距离多少天多少小时多少分多少秒
     *
     * @param str1 时间参数 1 格式:1990-01-01 12:00:00
     * @param str2 时间参数 2 格式:2009-01-01 12:00:00
     * @return String 返回值为:xx天xx小时xx分xx秒
     */
    public static String getDistanceTime(Long time1, Long time2) {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date one;
        Date two;
        long day = 0;
        long hour = 0;
        long min = 0;
        long sec = 0;
        try {
            long diff;
            if (time1 < time2) {
                diff = time2 - time1;
            } else {
                diff = time1 - time2;
            }
            day = diff / (24 * 60 * 60 * 1000);
            hour = (diff / (60 * 60 * 1000) - day * 24);
            min = ((diff / (60 * 1000)) - day * 24 * 60 - hour * 60);
            sec = (diff / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //return day + "天" + hour + "小时" + min + "分" + sec + "秒";
        return (day > 0 ? day + "天" : "")
                + (hour > 0 ? hour + "小时" : "")
                + (min > 0 ? min + "分" : "")
                + (sec > 0 ? sec + "秒" : "0秒");
    }

    /**
     * 两个时间相差距离多少天多少小时多少分多少秒
     *
     * @param str1 时间参数 1 格式:1990-01-01 12:00:00
     * @param str2 时间参数 2 格式:2009-01-01 12:00:00
     * @return String 返回值为:xx天xx小时xx分xx秒
     */
    public static String getDistanceTime(Date date1, Date date2) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date1);
        Long time1 = cal.getTimeInMillis();
        cal.setTime(date2);
        Long time2 = cal.getTimeInMillis();

        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date one;
        Date two;
        long day = 0;
        long hour = 0;
        long min = 0;
        long sec = 0;
        try {
            long diff;
            if (time1 < time2) {
                diff = time2 - time1;
            } else {
                diff = time1 - time2;
            }
            day = diff / (24 * 60 * 60 * 1000);
            hour = (diff / (60 * 60 * 1000) - day * 24);
            min = ((diff / (60 * 1000)) - day * 24 * 60 - hour * 60);
            sec = (diff / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // return day + "天" + hour + "小时" + min + "分" + sec + "秒";
        return (day > 0 ? day + "天" : "")
                + (hour > 0 ? hour + "小时" : "")
                + (min > 0 ? min + "分" : "")
                + (sec > 0 ? sec + "秒" : "0秒");
    }


    /**
     * 判断是否当月最后一天
     *
     * @param date
     * @return
     */
    public static boolean TestLastDay(String date) {
        int lastDay = 0;
        int now = 0;
        try {

            Date a = string2Date(date);
            Calendar b = Calendar.getInstance();
            b.setTime(a);
            lastDay = b.getActualMaximum(Calendar.DAY_OF_MONTH);
            now = b.get(Calendar.DAY_OF_MONTH);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (now == lastDay);
    }


    public static boolean isToday(String date, String format) {
        SimpleDateFormat fmt = new SimpleDateFormat(format);
        if (date.equals(fmt.format(new Date()).toString())) {//格式化为相同格式
            return true;
        } else {
            return false;
        }
    }

    /**
     * 是否是当年当月
     *
     * @param date
     * @param format
     * @return <0: 小于某年某月
     * =0:等于某年某月
     * >0:大于某年某月
     */
    public static Integer isCurrYearAndMonth(String date, int year, int month) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(string2Date(date));
        String year1 = String.valueOf(cal.get(Calendar.YEAR));
        String month1 = String.valueOf(cal.get(Calendar.MONTH) + 1);

        String _date1 = year1 + month1;
        String _date2 = String.valueOf(year) + String.valueOf(month);
        return Integer.parseInt(_date1) - Integer.parseInt(_date2);
    }


    public static void main(String rgs[]) {
    /*    System.out.println("去年年底:" + get1YearBeforeLastDay("2015-01-01"));
        System.out.println("前年年底:" + get2YearBeforeLastDay("2015-01-01"));
        System.out.println("去年同期:" + getLastYearPeriod("2017-12-31"));
        System.out.println("上月同期:" + getLastMonthPeriod("2017-03-29"));
        System.out.println("某年分月(截止到当月)" + getCurrYearMonths("2017-08-30", true));
        System.out.println("某年分月(12个月)" + getCurrYearMonths("2017-08-30", false));
        System.out.println("某年上年12个月+当年截止到当月" + get2YearMonths("2017-08-30", true));
        System.out.println("某年上年12个月+当年12个月月" + get2YearMonths("2017-08-30", false));
        System.out.println(getCurrYearMonthsDis("2016-01-31"));
        System.out.println(getLastYearMonthPeriod("2016-03-02"));

        System.out.println(isToday("2017-04-23",DATE_FORMAT));

        System.out.println(getDateByAddDays("2017-03-01",-1,10));

        System.out.println(isCurrYearAndMonth("2017-03-01",2017,03));
        System.out.println(getYearFromDate("2017-02-15") );
        System.out.println("sales_library,ybxs".split("[;]").length);*/
System.out.println(DateConvertUtil.getXYearXMonthLastDay(2017, 2));
        System.out.println(getDateSringByAddDays("2017-12-31", -1,true,false));
        System.out.println(getDateSringByAddDays("2017-12-01", -1,true,false));

        System.out.println(getDateByAddDays("2017-06-01",-1,10));
        System.out.println(isYearStart("2017-01-01"));
        System.out.println(isMonthStart("2017-01-01"));
    }


    /**
     * 判断当天是否为本月一号
     *
     * @return
     */
    public static boolean earlyMonth(String date) throws Exception {
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date time = simpleDateFormat.parse(date);
        calendar.setTime(time);
        int today = calendar.get(calendar.DAY_OF_MONTH);
        if (today == 1) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 获取昨天的日期
     *
     * @return
     */
    public static String getYesterdayDate(String date) throws ParseException {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date time = new Date(simpleDateFormat.parse(date).getTime() - 24 * 60 * 60 * 1000);
        return simpleDateFormat.format(time);
    }

    /**
     * 判断是否为年的第一天
     *
     * @param date
     * @return
     * @throws ParseException
     */
    public static boolean earlyYear(String date) throws ParseException {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date time = simpleDateFormat.parse(date);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(time);
        calendar.set(Calendar.DATE, (calendar.get(Calendar.DATE)));
        if (calendar.get(Calendar.DAY_OF_YEAR) == 1) {
            return true;
        }
        return false;
    }

    /**
     * @param
     * @param 根据长度返回年份或月份 4年7月
     * @return
     */
    public static String getPlanYearOrMonth(String date, int length) {
        return date.substring(0, length);
    }
}

 

DateConvertUtil 日期工具类