牛骨文教育服务平台(让学习变的简单)
博文笔记

DateUtil

创建时间:2016-08-18 投稿人: 浏览次数:362
/**
 * @Title: DateUtil
 * @Description: 时间转换工具类
 * @Team: 财务研发部
 * @Author Andy-ZhichengYuan
 * @Date 2014年12月9日
 * @Version V1.0
 */
public class DateUtil {
    private static final Logger LOG = LoggerFactory.getLogger(DateUtil.class);
    public static final String MINTIME = " 00:00:00";
    public static final String MAXTIME = " 23:59:59";


    public static final String LONGFMT20 = "yyyy-MM-dd HH:mm:ss.SSS";
    public static final String LONGFMT19 = "yyyy-MM-dd HH:mm:ss";
    public static final String LONGFMT16 = "yyyyMMdd-HH:mm:ss";
    public static final String LONGFMT15 = "yyyyMMdd HHmmss";
    public static final String LONGFMT14 = "yyyyMMddhhmmss";


    public static final String SHORTFMTT12 = "HH:mm:ss.SSS";
    public static final String SHORTFMT10 = "yyyy-MM-dd";
    public static final String SHORTFMTMD = "yyyy-M-d";
    public static final String SHORTFMTD8 = "yyyyMMdd";
    public static final String SHORTFMTT8 = "HH:mm:ss";
    public static final String SHORTFMTT6 = "HHmmss";


    /**
     * 
     * <p>
     * Title:
     * </p>
     * <p>
     * Description: 因为DateUtil是工具类,提供的方法全是静态,不需要提供公有构造方法
     * </p>
     */
    private DateUtil() {


    }


    /**
     * 
     * @Title: getIntFrDate @Description:时间转int类型毫秒数(返回数据做了除1000的处理) @param
     *         date @return @throws
     */
    public static Integer getIntFrDate(String dateStr) {
        SimpleDateFormat sdf = new SimpleDateFormat(LONGFMT19);
        Integer dateInt = 0;


        try {
            Date date = sdf.parse(dateStr);
            Long dateL = date.getTime();
            dateInt = (int) (dateL / 1000);
        } catch (ParseException e) {
            LOG.error("DateUtil,getIntFrDate", e);
        }
        return dateInt;
    }


    /**
     * 
     * @Title: getDateFrInt @Description: int型毫秒数转固定格式时间字符串 @param
     *         dateInt @return @throws
     */
    public static String getDateFrInt(Integer dateInt) {
        Long dateL = dateInt * 1000L;
        Date date = new Date(dateL);
        SimpleDateFormat sdf = new SimpleDateFormat(LONGFMT19);
        String dateStr = sdf.format(date);
        return dateStr;
    }


    /**
     * 根据传入的日期格式转换 @Title: getDateFrIntByDateType
     * @Description: 根据时间格式,将秒转换为对应的时间
     * @param dateInt
     * @param dateType
     * @return
     * @throws
     */
    public static String getDateFrIntByDateType(Integer dateInt,
            String dateType) {
        Long dateL = dateInt * 1000L;
        Date date = new Date(dateL);
        SimpleDateFormat sdf = new SimpleDateFormat(dateType);
        String dateStr = sdf.format(date);
        return dateStr;
    }


    /**
     * 根据传入的模式获取日期的格式类对象SimpleDateFormat
     * 
     * @param pattern:
     *            longFmt19 yyyy-MM-dd HH:mm:ss longFmt15 yyyyMMdd HHmmss
     *            shortFmt10 yyyy-MM-dd shortFmtT8 HH:mm:ss
     */
    public static SimpleDateFormat getFmt(String pattern) {
        SimpleDateFormat formatter = new SimpleDateFormat(pattern);
        return formatter;
    }


    /**
     * 根据传入的模式获取 现在的 日期时间Date
     * 
     * @param pattern:
     *            longFmt19 yyyy-MM-dd HH:mm:ss longFmt15 yyyyMMdd HHmmss
     *            shortFmt10 yyyy-MM-dd shortFmtT8 HH:mm:ss
     */
    public static Date getNowDateByFmt(String pattern) {
        Date crtTime = new Date();
        SimpleDateFormat formatter = getFmt(pattern);
        String dateString = formatter.format(crtTime);


        ParsePosition pos = new ParsePosition(0);
        Date crtDate = formatter.parse(dateString, pos);
        return crtDate;
    }


    /**
     * 根据格式将 传入日期的 String转换成相应格式的Date
     * 
     * @param pattern:
     *            longFmt19 yyyy-MM-dd HH:mm:ss longFmt15 yyyyMMdd HHmmss
     *            shortFmt10 yyyy-MM-dd shortFmtT8 HH:mm:ss
     */
    public static Date strToDateByFmt(String strDate, String pattern) {
        SimpleDateFormat fmter = getFmt(pattern);
        ParsePosition pos = new ParsePosition(0);
        Date strtodate = fmter.parse(strDate, pos);
        return strtodate;
    }


    /**
     * 根据传入的模式获取 现在的 日期时间字符串String
     * 
     * @param pattern:
     *            longFmt19 yyyy-MM-dd HH:mm:ss longFmt15 yyyyMMdd HHmmss
     *            longFmt14 yyyyMMddhhmmss shortFmt10 yyyy-MM-dd shortFmtD8
     *            yyyyMMdd shortFmtT8 HH:mm:ss
     */
    public static String getNowString(String pattern) {
        Date crtTime = new Date();
        SimpleDateFormat formatter = getFmt(pattern);
        String dateString = formatter.format(crtTime);
        return dateString;
    }


    /**
     * 根据格式将 传入日期Date转换成相应格式的String
     * 
     * @param pattern:
     *            longFmt19 yyyy-MM-dd HH:mm:ss longFmt15 yyyyMMdd HHmmss
     *            shortFmt10 yyyy-MM-dd shortFmtT8 HH:mm:ss
     */
    public static String dateToStringByFmt(Date date, String pattern) {
        SimpleDateFormat fmtter = getFmt(pattern);
        String dateString = fmtter.format(date);
        return dateString;
    }


    //////////////////////////////////////////////////////////////////////////////////


    /**
     * US格式化的日期转化为CN的格式 (yyyy-MM-dd HH:mm:ss) US格式例如:Sat 26/Jun/2010:18:41:25
     * +0800
     */
    public static String usDateFormat(String date) {
        SimpleDateFormat f = null;
        try {
            if (StringTools.count(date, " ") == 2) {
                f = new SimpleDateFormat("EEE dd/MMM/yyyy:HH:mm:ss Z",
                        Locale.US);
            } else {
                f = new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss Z", Locale.US);
            }
            Date d = f.parse(date);
            f = new SimpleDateFormat(LONGFMT19);
            date = f.format(d);
        } catch (ParseException e) {
            LOG.error("US格式日期转化报错:", e);
        }
        return date;
    }


    /** 格式化日期的字符串 */
    public static String dateFormat(String date, String format) {
        try {
            if (!StringTools.isTrimNull(date)) {
                DateFormat df = DateFormat.getDateTimeInstance();
                // df = DateFormat.getDateInstance();
                Date d = df.parse(date);
                date = dateToStringByFmt(d, format);
                return date;
            }
        } catch (ParseException e) {
            LOG.error("格式化日期的字符串出错:" + date, e);
        }
        return date;
    }


    /**
     * 格式化日期的字符串
     * 
     * @param date
     *            : "07/17/2008 10:10:51 AM"
     * @param date
     *            : "07/17/2008 03:10:51 PM"
     */
    public static String dateFormat(String date) {
        try {
            if (!StringTools.isTrimNull(date)) {
                if (StringUtils.contains(date, "/")) {
                    SmartString s = new SmartString("-");
                    String[] ss = StringUtils.split(date, " ");
                    if (ss.length == 3) {
                        s.append(StringUtils.substringAfterLast(ss[0], "/"));
                        s.append(StringUtils.substringBefore(ss[0], "/"));
                        s.append(StringUtils.substringBetween(ss[0], "/", "/"));
                        if (StringUtils.equalsIgnoreCase(ss[2], "PM")) {
                            ss = StringUtils.split(ss[1], ":");
                            ss[0] = ""
                                    + (Integer.valueOf(ss[0]).intValue() + 12);
                            date = (ss[0] + ":" + ss[1] + ":" + ss[2]);
                        } else {
                            date = ss[1];
                        }
                        date = (s.toString() + " " + date);
                    }
                }
            }
        } catch (Exception e) {
            LOG.error("格式化日期的字符串出错:" + date, e);
        }
        return date;
    }


    /**
     * 得到现在时间
     * 
     * @return Date
     */
    public static Date getNow() {
        Date currentTime = new Date();
        return currentTime;
    }


    /**
     * 得到现在时间
     * 
     * @return String
     */
    public static String getNow(String pattern) {
        return getNowString(pattern);
    }


    /** 获得当天的日期:YYYY-MM-dd */
    public static String getToday() {
        return getNowString(SHORTFMT10);
    }


    /** 获得现在的时间:YYYY-MM-dd HH:mm:ss */
    public static String getNowTime() {
        return getNowString(LONGFMT19);
    }


    /**
     * 获取今天以前(负)、以后(正)的第{days}天的日期
     * 
     * @param days:
     *            今天以前的第n天,为负整数,以后为正整数
     */
    public static String getAgoBackDate(int days, String pattern) {
        Date date = new Date();
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        if (days != 0)
            cal.add(Calendar.DAY_OF_MONTH, days);
        date = cal.getTime();


        String dateStr = dateToStringByFmt(date, pattern);
        return dateStr;
    }


    /**
     * 获取相对系统当前日期<往前>或<往后>的n天日期, 格式:YYYY-MM-dd
     * 
     * @param n
     *            : -1, 1
     */
    public static String getAgoBackDate(int n) {
        String now = getNowString(SHORTFMT10);
        if (n == 0) {
            return now;
        } else {
            return getNextDay(now, n);
        }
    }


    /**
     * 提取一个月中的最后一天
     * 
     * @param day
     * @return Date
     */
    public static Date getLastDate(long day) {
        Date date = new Date();
        long date_3_hm = date.getTime() - 3600000 * 24 * day;
        Date date_3_hm_date = new Date(date_3_hm);
        return date_3_hm_date;
    }


    /**
     * 得到现在小时
     * 
     * @return String
     */
    public static String getHour() {
        Date currentTime = new Date();
        SimpleDateFormat formatter = getFmt(LONGFMT19);
        String dateString = formatter.format(currentTime);
        String hour;
        hour = dateString.substring(11, 13);
        return hour;
    }


    /**
     * 得到现在分钟
     * 
     * @return String
     */
    public static String getMinute() {
        Date currentTime = new Date();
        SimpleDateFormat formatter = getFmt(LONGFMT19);
        String dateString = formatter.format(currentTime);
        String min;
        min = dateString.substring(14, 16);
        return min;
    }


    /**
     * 获取现在的HH:mm 小时和分钟
     * 
     * @return String HH:mm
     */
    public static String getNowHHmm() {
        return DateUtil.getNowString(DateUtil.SHORTFMTT8).substring(0, 5);// HH:mm
    }


    /**
     * 获取现在的HH:mm:ss 小时和分钟
     * 
     * @return String HH:mm
     */
    public static String getNowHHmmss() {
        return getNowString(SHORTFMTT8).substring(0, 8);// HH:mm
    }


    /** 判断值是否是HH:mm:ss的格式 */
    public static boolean isHHmmss(String hhmmss) {
        if (!StringTools.isTrimNull(hhmmss)) {
            return Pattern.matches("[0-9]{2}:[0-9]{2}:[0-9]{2}", hhmmss);
        }
        return false;
    }


    /** 计算当天两个时间(HH:mm:ss)的秒钟差 */
    public static long compare2Date(String startHHmmss, String endHHmmss) {
        long s = DateUtil.strToDateByFmt(startHHmmss, DateUtil.SHORTFMTT8)
                .getTime();
        long e = DateUtil.strToDateByFmt(endHHmmss, DateUtil.SHORTFMTT8)
                .getTime();
        long seconds = (s - e) / 1000; // s
        return seconds;
    }


    /** 计算HH:mm:ss相加/减deltaMinute分钟后的值 */
    public static String plusMinute(String HHmmss, int deltaMinute) {
        long l = DateUtil.strToDateByFmt(HHmmss, DateUtil.SHORTFMTT8).getTime();
        l += (deltaMinute * 60 * 1000);
        Date date = new Date(l);
        return dateToStringByFmt(date, SHORTFMTT8);
    }


    /**
     * 计算两个时分的差值,返回字符型的 小时数
     * 
     * @param minHm
     *            < bigHm 格式:HH:mm
     * @return String
     */
    public static String getTwoHour(String minHm, String bigHm) {
        String[] min = null;
        String[] big = null;
        min = minHm.split(":");
        big = bigHm.split(":");
        if ("0".equals(min[0].trim()))
            min[0] = "24";
        if ("0".equals(big[0].trim()))
            big[0] = "24";
        if (Integer.parseInt(min[0]) > Integer.parseInt(big[0]))
            return "0";
        else {
            double y = Double.parseDouble(min[0])
                    + Double.parseDouble(min[1]) / 60;
            double u = Double.parseDouble(big[0])
                    + Double.parseDouble(big[1]) / 60;
            if (y > u)
                return "0";
            else
                return u - y + "";
        }
    }


    /**
     * 计算两个时分的差值,返回int型的 分钟数
     * 
     * @param minHm
     *            < bigHm 格式:HH:mm
     * @return double
     */
    public static double getTwoMinute(String minHm, String bigHm) {
        String[] min = null;
        String[] big = null;
        min = minHm.split(":");
        big = bigHm.split(":");
        if ("00".equals(min[0].trim()))
            min[0] = "24";
        if ("00".equals(big[0].trim()))
            big[0] = "24";
        if (Integer.parseInt(min[0]) > Integer.parseInt(big[0]))
            return 0;
        else {
            double m = Double.parseDouble(min[0]) * 60
                    + Double.parseDouble(min[1]);
            double b = Double.parseDouble(big[0]) * 60
                    + Double.parseDouble(big[1]);
            if (m > b) {
                return 0;
            }
            return b - m;
        }
    }


    /**
     * 判断Date(yyyy-MM-dd)日期是否是在参照日期以前
     * 
     * @param date:
     *            yyyy-MM-dd, 判定日期
     * @param refer:yyyy-MM-dd,
     *            参照日期
     * @return boolean
     */
    public static boolean isAgoRefer(String date, String refer) {
        long day = getDays(date, refer);
        return (day < 0);
    }


    /**
     * 判断Date(yyyy-MM-dd)日期是否是在参照日期以后
     * 
     * @param date:
     *            yyyy-MM-dd, 判定日期
     * @param refer:yyyy-MM-dd,
     *            参照日期
     * @return boolean
     */
    public static boolean isAfterRefer(String date, String refer) {
        long day = getDays(date, refer);
        return (day > 0);
    }


    /**
     * 得到二个日期间的间隔天数
     * 
     * @param sj1
     *            , sj2 yyyy-MM-dd
     * @return String
     */
    public static String getTwoDay(String sj1, String sj2) {
        long day = 0;
        try {
            SimpleDateFormat myFormatter = getFmt(SHORTFMT10);
            java.util.Date date = myFormatter.parse(sj1);
            java.util.Date mydate = myFormatter.parse(sj2);
            day = (date.getTime() - mydate.getTime()) / (24 * 60 * 60 * 1000);
        } catch (Exception e) {
            LOG.error("DateUtil,getTwoDay", e);
            return "0";
        }
        return "" + day;
    }


    /**
     * 时间前推或后推分钟,其中mm表示分钟.
     * 
     * @param sj1
     *            , mm yyyy-MM-dd HH:mm:ss
     * @return String
     */
    public static String getPreTime(String sj1, String mm) {
        SimpleDateFormat format = getFmt(LONGFMT19);
        String mydate1 = "";
        try {
            Date date1 = format.parse(sj1);
            long Time = (date1.getTime() / 1000) + Integer.parseInt(mm) * 60;
            date1.setTime(Time * 1000);
            mydate1 = format.format(date1);
        } catch (Exception e) {
            LOG.error("getPreTime is error: " + e.getMessage());
            return sj1;
        }
        return mydate1;
    }


    /**
     * 得到一个时间延后或前移几天的时间,nowdate为时间,delay为前移或后延的天数
     * 
     * @param nowdate:
     *            YYYY-MM-dd
     * @param delay:
     *            int(-1, 1)
     * @return String YYYY-MM-dd
     */
    public static String getNextDay(String nowdate, int delay) {
        try {
            SimpleDateFormat format = getFmt(SHORTFMT10);
            String mdate = "";
            Date d = strToDateByFmt(nowdate, SHORTFMT10);
            long myTime = (d.getTime() / 1000) + delay * 24 * 60 * 60;
            d.setTime(myTime * 1000);
            mdate = format.format(d);
            return mdate;
        } catch (Exception e) {
            LOG.error("DateUtil,getNextDay", e);
            return "";
        }
    }


    /**
     * 得到一个时间延后或前移几天的时间,nowdate为时间,delay为前移或后延的天数,pattern为时间格式
     * 
     * @param nowdate:
     *            YYYY-MM-dd
     * @param delay:
     *            int(-1, 1)
     * @param pattern:
     *            时间格式
     * @return int 10位时间戳
     */
    public static int getNextDayByFmt(String nowdate, int delay,
            String pattern) {
        try {
            Date d = strToDateByFmt(nowdate, pattern);
            int myTime = (int) ((d.getTime() / 1000) + delay * 86400);
            return myTime;
        } catch (Exception e) {
            LOG.error("DateUtil,getNextDayByFmt", e);
            return 0;
        }
    }


    /**
     * 判断是否润年
     * 
     * @param ddate
     *            yyyy-MM-dd
     * @return boolean
     */
    public static boolean isLeapYear(String ddate) {
        /**
         * 详细设计: 1.被400整除是闰年,否则: 2.不能被4整除则不是闰年 3.能被4整除同时不能被100整除则是闰年
         * 4.能被4整除同时能被100整除则不是闰年
         */
        Date d = strToDateByFmt(ddate, SHORTFMT10);
        GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();
        gc.setTime(d);
        int year = gc.get(Calendar.YEAR);
        if ((year % 400) == 0)
            return true;
        else if ((year % 4) == 0) {
            if ((year % 100) == 0)
                return false;
            else
                return true;
        } else
            return false;
    }


    /**
     * 返回美国时间格式 26 Apr 2006
     * 
     * @param str
     *            yyyy-MM-dd
     * @return String
     */
    public static String getEDate(String str) {
        SimpleDateFormat formatter = getFmt(SHORTFMT10);
        ParsePosition pos = new ParsePosition(0);
        Date strtodate = formatter.parse(str, pos);
        String j = strtodate.toString();
        String[] k = j.split(" ");
        return k[2] + k[1].toUpperCase() + k[5].substring(2, 4);
    }


    /**
     * 获取一个月的最后一天
     * 
     * @param dat
     *            yyyy-MM-dd
     * @return String
     */
    public static String getEndDateOfMonth(String dat) {
        String str = dat.substring(0, 8);
        String month = dat.substring(5, 7);
        int mon = Integer.parseInt(month);
        if (mon == 1 || mon == 3 || mon == 5 || mon == 7 || mon == 8
                || mon == 10 || mon == 12) {
            str += "31";
        } else if (mon == 4 || mon == 6 || mon == 9 || mon == 11) {
            str += "30";
        } else {
            if (isLeapYear(dat)) {
                str += "29";
            } else {
                str += "28";
            }
        }
        return str;
    }


    /**
     * 判断两个String类型的日期是否是在同一个周
     * 
     * @param start,end
     *            yyyy-MM-dd (HH:mm:ss)
     * @return boolean
     */
    public static boolean isSameWeek(String start, String end) {
        Date dt1 = null;
        Date dt2 = null;
        if (start.length() == 10 && end.length() == 10) {
            dt1 = strToDateByFmt(start, DateUtil.SHORTFMT10);
            dt2 = strToDateByFmt(end, DateUtil.SHORTFMT10);
        } else if (start.length() == 19 && end.length() == 19) {
            dt1 = strToDateByFmt(start, DateUtil.LONGFMT19);
            dt2 = strToDateByFmt(end, DateUtil.LONGFMT19);
        } else {
            return false;
        }
        return isSameWeekDates(dt1, dt2);
    }


    /**
     * 判断两个时间是否在同一个周
     * 
     * @param date1
     *            date2 Date
     * @return boolean
     */
    public static boolean isSameWeekDates(Date date1, Date date2) {
        Calendar cal1 = Calendar.getInstance();
        Calendar cal2 = Calendar.getInstance();
        if (date1 == null || date2 == null) {
            return false;
        }
        cal1.setTime(date1);
        cal2.setTime(date2);
        int subYear = cal1.get(Calendar.YEAR) - cal2.get(Calendar.YEAR);
        if (0 == subYear) {
            if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2
                    .get(Calendar.WEEK_OF_YEAR))
                return true;
        } else if (1 == subYear && 11 == cal2.get(Calendar.MONTH)) {
            // 如果12月的最后一周横跨来年第一周的话则最后一周即算做来年的第一周
            if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2
                    .get(Calendar.WEEK_OF_YEAR))
                return true;
        } else if (-1 == subYear && 11 == cal1.get(Calendar.MONTH)) {
            if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2
                    .get(Calendar.WEEK_OF_YEAR))
                return true;
        }
        return false;
    }


    /**
     * 产生周序列,即得到当前时间所在的年度是第几周
     * 
     * @return String
     */
    public static String getSeqWeek() {
        Calendar c = Calendar.getInstance(Locale.CHINA);
        String week = Integer.toString(c.get(Calendar.WEEK_OF_YEAR));
        if (week.length() == 1)
            week = "0" + week;
        String year = Integer.toString(c.get(Calendar.YEAR));
        return year + week;
    }


    /**
     * 获得一个日期所在的周的星期几的日期,如要找出2002年2月3日所在周的星期一是几号
     * 
     * @param sdate
     *            yyyy-MM-dd
     * @param num
     * @return String
     */
    public static String getWeek(String sdate, String num) {
        // 再转换为时间
        Date dd = DateUtil.strToDateByFmt(sdate, SHORTFMT10);
        Calendar c = Calendar.getInstance();
        c.setTime(dd);
        if (num.equals("1"))       // 返回星期一所在的日期
            c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        else if (num.equals("2"))       // 返回星期二所在的日期
            c.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY);
        else if (num.equals("3"))       // 返回星期三所在的日期
            c.set(Calendar.DAY_OF_WEEK, Calendar.WEDNESDAY);
        else if (num.equals("4"))       // 返回星期四所在的日期
            c.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY);
        else if (num.equals("5"))       // 返回星期五所在的日期
            c.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
        else if (num.equals("6"))       // 返回星期六所在的日期
            c.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
        else if (num.equals("0"))       // 返回星期日所在的日期
            c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
        return new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
    }


    /**
     * 根据一个日期,返回是星期几的字符串
     * 
     * @param sdate
     *            yyyy-MM-dd
     * @return String
     */
    public static String getWeek(String sdate) {
        // 再转换为时间
        Date date = DateUtil.strToDateByFmt(sdate, SHORTFMT10);
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        // int hour=c.get(Calendar.DAY_OF_WEEK);
        // hour中存的就是星期几了,其范围 1~7
        // 1=星期日 7=星期六,其他类推
        return new SimpleDateFormat("EEEE").format(c.getTime());
    }


    /**
     * 获取Current当前日期的星期数字<br>
     * 
     * @return 当前日期的星期: 0~6
     */
    public static int getCurrWeek() {
        Date dt = new Date();
        Calendar cal = Calendar.getInstance();
        cal.setTime(dt);
        int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
        if (w < 0)
            w = 0;
        return w;
    }


    /**
     * 获取YYYY-MM-dd日期的星期数字<br>
     * 
     * @param date:
     *            yyyy-MM-dd
     * @return 当前日期的星期: 0~6
     */
    public static int getWeekInt(String date) {
        Date dt = strToDateByFmt(date, SHORTFMT10);
        Calendar cal = Calendar.getInstance();
        cal.setTime(dt);
        int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
        if (w < 0)
            w = 0;
        return w;
    }


    /**
     * 获取当前日期是星期几<br>
     * 
     * @param dt
     * @return 当前日期是星期几
     */
    public static String getWeekOfDate(String date) {
        String[] weekDays = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
        int w = getWeekInt(date);
        return weekDays[w];
    }


    /**
     * 获取当前日期的星期汉字数<br>
     * 
     * @return 当前日期的星期: 一、二...
     */
    public static String getNowWeek() {
        String[] weekDays = { "日", "一", "二", "三", "四", "五", "六" };
        int w = getCurrWeek();
        return weekDays[w];
    }


    /**
     * 根据Current当前日期的星期数字,计算往前一周的天数<br>
     * 
     * @return 当前日期的星期: 0~6
     */
    public static int getAgoWeekDays() {
        int w = getCurrWeek();
        if (w > 1)
            return -w;
        if (w == 0) {
            return -6;
        } else {// w == 1
            return -7;
        }
    }


    /**
     * 根据Current当前日期的星期数字,计算往前一个工作日的日期<br>
     * 
     * @return 往前一工作日期: yyyy-MM-dd
     */
    public static String getAgoOneWorkDay() {
        int w = getCurrWeek();
        if (w == 0) {// 星期日
            return getAgoBackDate(-2);
        } else if (w == 1) {// 星期一
            return getAgoBackDate(-3);
        } else {// w >= 2
            return getAgoBackDate(-1);
        }
    }


    /**
     * 获取当前日期是星期几的一个int值<br>
     * 
     * @param dt
     * @return 当前日期是星期几 int
     */
    public static int getWkIntOfDate(Date dt) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(dt);


        int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
        if (w < 0)
            w = 0;


        return w;
    }


    /**
     * 根据日期来获取它是在星期几的汉字数<br>
     * 
     * @param longDate
     *            yyyy-MM-dd HH:mm:ss
     * @return String 日期的星期几: 一、二...
     */
    public static String getWeekCNword(String longDate) {
        String[] weekDays = { "日", "一", "二", "三", "四", "五", "六" };
        Date dt = strToDateByFmt(longDate, LONGFMT19);
        Calendar cal = Calendar.getInstance();
        cal.setTime(dt);


        int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
        if (w < 0)
            w = 0;


        return weekDays[w];
    }


    /**
     * 根据一个日期格式的字符串,获得星期几
     * 
     * @param sdate
     *            yyyy-MM-dd
     * @return "星期几"
     */
    public static String getWeekStr() {
        // String sdate
        // String str = DateUtil.getWeek(sdate);
        int w = getCurrWeek();
        switch (w) {
        case 0:
            return "星期日";
        case 1:
            return "星期一";
        case 2:
            return "星期二";
        case 3:
            return "星期三";
        case 4:
            return "星期四";
        case 5:
            return "星期五";
        case 6:
            return "星期六";
        default:
            return "";
        }
    }


    /**
     * 获取两个时间之间的天数
     * 
     * @param date1,date2:
     *            yyyy-MM-dd
     * @return long: (date1 - date2)天数
     */
    public static long getDays(String date1, String date2) {
        if (date1 == null || "".equals(date1))
            date1 = getNow(SHORTFMT10);
        if (date2 == null || "".equals(date2))
            return 0;
        long day = 0;
        try {
            // 转换为标准时间
            SimpleDateFormat myFormatter = getFmt(SHORTFMT10);
            java.util.Date d1 = myFormatter.parse(date1);
            java.util.Date d2 = myFormatter.parse(date2);
            day = (d1.getTime() - d2.getTime()) / (24 * 60 * 60 * 1000);
        } catch (Exception e) {
            LOG.error("get 2 Date days is error: " + e.getMessage());
            day = 0;
        }
        return day;
    }


    /**
     * 获取两个时间之间的小时数
     * 
     * @param date1,
     *            date2: yyyy-MM-dd HH:mm:ss
     * @return long: (date1 - date2)小时数
     */
    public static long getHours(String date1, String date2) {
        if (date1 == null || "".equals(date1))
            date1 = getNow(LONGFMT19);
        if (date2 == null || "".equals(date2))
            return 0;
        long min = 0;
        try {
            // 转换为标准时间
            SimpleDateFormat myFormatter = getFmt(LONGFMT19);
            java.util.Date d1 = myFormatter.parse(date1);
            java.util.Date d2 = myFormatter.parse(date2);
            min = (d1.getTime() - d2.getTime()) / 24;
        } catch (Exception e) {
            LOG.error("get 2 Date days is error: " + e.getMessage());
            min = 0;
        }
        return min;
    }


    /**
     * 获取两个时间之间的分钟数
     * 
     * @param date1,
     *            date2: yyyy-MM-dd HH:mm:ss
     * @return long: (date1 - date2)分钟数
     */
    public static long getMinutes(String date1, String date2) {
        if (date1 == null || "".equals(date1))
            date1 = getNow(LONGFMT19);
        if (date2 == null || "".equals(date2))
            return 0;
        long min = 0;
        try {
            // 转换为标准时间
            SimpleDateFormat myFormatter = getFmt(LONGFMT19);
            java.util.Date d1 = myFormatter.parse(date1);
            java.util.Date d2 = myFormatter.parse(date2);
            min = (d1.getTime() - d2.getTime()) / (24 * 60 * 60);
        } catch (Exception e) {
            LOG.error("get 2 Date days is error: " + e.getMessage());
            min = 0;
        }
        return min;
    }


    /**
     * 获取两个时间之间的秒钟数
     * 
     * @param date1,
     *            date2: yyyy-MM-dd HH:mm:ss
     * @return long: (date1 - date2)秒钟数
     */
    public static long getSeconds(String date1, String date2) {
        if (date1 == null || "".equals(date1))
            date1 = getNow(LONGFMT19);
        if (date2 == null || "".equals(date2))
            return 0;
        long scd = 0;
        try {
            // 转换为标准时间
            SimpleDateFormat myFormatter = getFmt(LONGFMT19);
            java.util.Date d1 = myFormatter.parse(date1);
            java.util.Date d2 = myFormatter.parse(date2);
            scd = (d1.getTime() - d2.getTime()) / (24 * 60 * 60);
        } catch (Exception e) {
            LOG.error("get 2 Date days is error: " + e.getMessage());
            scd = 0;
        }
        return scd;
    }


    /**
     * 形成如下的日历 , 根据传入的一个时间返回一个结构 星期日 星期一 星期二 星期三 星期四 星期五 星期六 下面是当月的各个时间
     * 此函数返回该日历第一行星期日所在的日期
     * 
     * @param sdate
     *            yyyy-MM-dd
     * @return String
     */
    public static String getNowMonth(String sdate) {
        // 取该时间所在月的一号
        sdate = sdate.substring(0, 8) + "01";


        // 得到这个月的1号是星期几
        Date date = DateUtil.strToDateByFmt(sdate, SHORTFMT10);
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        int u = c.get(Calendar.DAY_OF_WEEK);
        String newday = DateUtil.getNextDay(sdate, (1 - u));
        return newday;
    }


    /**
     * 取得数据库主键 生成格式为yyyymmddhhmmss+k位随机数
     * 
     * @param k
     *            表示是取几位随机数,可以自己定
     * @return String
     */
    public static String getNo(int k) {
        return DateUtil.getNowString(LONGFMT14) + getRandom(k);
    }


    /**
     * 返回一个随机数
     * 
     * @param i
     * @return String
     */
    public static String getRandom(int i) {
        Random jjj = new Random();
        if (i == 0)
            return "";
        String jj = "";
        for (int k = 0; k < i; k++) {
            jj = jj + jjj.nextInt(9);
        }
        return jj;
    }


    /**
     * 判断String是否是Date格式
     * 
     * @param data
     *            yyyy-MM-dd (HH:mm:ss)
     * @return boolean
     */
    public static boolean rightDate(String date) {
        SimpleDateFormat sdf = getFmt(LONGFMT19);
        if (date == null)
            return false;
        if (date.length() > 10) {
            sdf = getFmt(LONGFMT19);
        } else {
            sdf = getFmt(SHORTFMT10);
        }
        try {
            sdf.parse(date);
        } catch (ParseException pe) {
            LOG.error("DateUtil,rightDate", pe);
            return false;
        }
        return true;
    }


    /**
     * 获取传入的sdate相应的格式日期
     * 
     * @param sdate
     *            yyyy-MM-dd
     * @param nd=1表示返回的值中包含年度
     * @param yf=1表示返回的值中包含月份
     * @param rq=1表示返回的值中包含日期
     *            //
     * @param format表示返回的格式
     *            : 1 以年月日中文返回 2 以横线-返回 3 以斜线/返回 4 以缩写不带其它符号形式返回 5 以点号.返回
     **/
    public static String getStringDateMonth(String sdate, String nd, String yf,
            String rq, String format) {
        Date currentTime = new Date();
        SimpleDateFormat formatter = getFmt(SHORTFMT10);
        String dateString = formatter.format(currentTime);
        String s_nd = dateString.substring(0, 4); // 年份
        String s_yf = dateString.substring(5, 7); // 月份
        String s_rq = dateString.substring(8, 10); // 日期
        String sreturn = "";


        if (sdate == null || sdate.equals("") || !isDate(sdate)) { // 处理空值情况
            if (nd.equals("1")) {
                sreturn = s_nd;
                // 处理间隔符
                if (format.equals("1"))
                    sreturn = sreturn + "年";
                else if (format.equals("2"))
                    sreturn = sreturn + "-";
                else if (format.equals("3"))
                    sreturn = sreturn + "/";
                else if (format.equals("5"))
                    sreturn = sreturn + ".";
            }
            // 处理月份
            if (yf.equals("1")) {
                sreturn = sreturn + s_yf;
                if (format.equals("1"))
                    sreturn = sreturn + "月";
                else if (format.equals("2"))
                    sreturn = sreturn + "-";
                else if (format.equals("3"))
                    sreturn = sreturn + "/";
                else if (format.equals("5"))
                    sreturn = sreturn + ".";
            }
            // 处理日期
            if (rq.equals("1")) {
                sreturn = sreturn + s_rq;
                if (format.equals("1"))
                    sreturn = sreturn + "日";
            }
        } else {
            // 不是空值,也是一个合法的日期值,则先将其转换为标准的时间格式
            sdate = getOKDate(sdate);
            s_nd = sdate.substring(0, 4); // 年份
            s_yf = sdate.substring(5, 7); // 月份
            s_rq = sdate.substring(8, 10); // 日期
            if (nd.equals("1")) {
                sreturn = s_nd;
                // 处理间隔符
                if (format.equals("1"))
                    sreturn = sreturn + "年";
                else if (format.equals("2"))
                    sreturn = sreturn + "-";
                else if (format.equals("3"))
                    sreturn = sreturn + "/";
                else if (format.equals("5"))
                    sreturn = sreturn + ".";
            }
            // 处理月份
            if (yf.equals("1")) {
                sreturn = sreturn + s_yf;
                if (format.equals("1"))
                    sreturn = sreturn + "月";
                else if (format.equals("2"))
                    sreturn = sreturn + "-";
                else if (format.equals("3"))
                    sreturn = sreturn + "/";
                else if (format.equals("5"))
                    sreturn = sreturn + ".";
            }
            // 处理日期
            if (rq.equals("1")) {
                sreturn = sreturn + s_rq;
                if (format.equals("1"))
                    sreturn = sreturn + "日";
            }
        }
        return sreturn;
    }


    /**
     * 获取-m或m个月后当前的日期
     * 
     * @param sdate
     *            yyyy-MM-dd , m(-int/int)
     * @return String
     */
    public static String getNextMonthDate(String sdate, int m) {
        sdate = getOKDate(sdate);
        Date date = strToDateByFmt(sdate, SHORTFMT10);
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(Calendar.MONTH, m);
        return dateToStringByFmt(c.getTime(), SHORTFMT10);
    }


    /**
     * 将一个合法的String转换为标准的时间格式
     * 
     * @param sdate
     *            yyyy-MM-dd
     * @return String
     */
    public static String getOKDate(String sdate) {
        if (sdate == null || "".equals(sdate))
            return getNowString(SHORTFMT10);
        // 将"/"转换为"-"
        sdate = StringUtils.replace(sdate, "/", "-");
        // 如果只有8位长度,则要进行转换
        if (sdate.length() == 8)
            sdate = sdate.substring(0, 4) + "-" + sdate.substring(4, 6) + "-"
                    + sdate.substring(6, 8);
        if (!isDate(sdate)) {
            sdate = getNowString(SHORTFMT10);
        }


        SimpleDateFormat formatter = getFmt(SHORTFMT10);
        ParsePosition pos = new ParsePosition(0);
        Date strtodate = formatter.parse(sdate, pos);
        String dateString = formatter.format(strtodate);
        return dateString;
    }


    /**
     * 判断是否是标准Date格式的String,可以适应: "yyyy-MM-dd" "yyyy-M-d" "yyyy-MM-d"
     * "yyyy-M-dd"
     * 
     * @param sdate
     * @return boolean
     */
    public static boolean isDate(String sdate) {
        try {
            SimpleDateFormat sdf = getFmt(SHORTFMTMD);
            sdf.setLenient(false);
            sdate = sdate.replaceAll("-0", "-");
            Date d = sdf.parse(sdate);
            String s = sdf.format(d);


            return sdate.equals(s);
        } catch (Exception e) {
            LOG.error("DateUtil,isDate", e);
            return false;
        }
    }


    /**
     * 比较两个日期差几D几H几M几S
     * 
     * @param start
     *            , end 格式yyyy-MM-dd HH:mm:ss
     * @return String
     */
    public static String compare2Dates(String start, String end) {
        SimpleDateFormat df = getFmt(LONGFMT19);
        Date sdate = null;
        Date edate = null;
        try {
            sdate = df.parse(start);
            edate = df.parse(end);
            long l = sdate.getTime() - edate.getTime();
            long day = l / (24 * 60 * 60 * 1000);
            long hour = (l / (60 * 60 * 1000) - day * 24);
            long min = ((l / (60 * 1000)) - day * 24 * 60 - hour * 60);
            long s = (l / 1000 - day * 24 * 60 * 60 - hour * 60 * 60
                    - min * 60);
            return day + "天" + hour + "小时" + min + "分" + s + "秒";
        } catch (ParseException e) {
            LOG.error("2 date compare is error: " + e.getMessage());
            return null;
        }
    }


    /** 计算两个时间的秒钟差 */
    public static long compare2Date(Date ago, Date late) {
        long seconds = 0l;
        if (ago != null && late != null) {
            seconds = (late.getTime() - ago.getTime()) / 1000; // s
        }
        return seconds;
    }


    /**
     * 比较当天两个时刻差几时几分几秒
     * 
     * @param start
     *            , end 格式HH:mm:ss
     * @return String
     */
    public static String compareNowDay2Times(String start, String end) {
        String[] st = start.trim().split(":");
        String[] et = end.trim().split(":");
        long h = Long.valueOf(et[0]) - Long.valueOf(st[0]);


        long m;
        long s;
        if (Long.valueOf(et[1]) < Long.valueOf(st[1])) {
            m = 60 - Long.valueOf(st[1]) + Long.valueOf(et[1]);
        } else {
            m = Long.valueOf(et[1]) - Long.valueOf(st[1]);
        }
        if (Long.valueOf(et[2]) < Long.valueOf(st[2])) {
            s = 60 - Long.valueOf(st[2]) + Long.valueOf(et[2]);
        } else {
            s = Long.valueOf(et[2]) - Long.valueOf(st[2]);
        }


        return h + "小时" + m + "分钟" + s + "秒";
    }


    /**
     * 判断一个日期是否 在一个日期段内
     * 
     * @param String
     *            start < end , itself 格式:YYYY-MM-DD
     * @return boolean
     */
    public static boolean isInSpanDate(String start, String end,
            String itself) {
        boolean flag = false;
        long s = strToDateByFmt(start, SHORTFMT10).getTime();
        long e = strToDateByFmt(end, SHORTFMT10).getTime();
        long i = strToDateByFmt(itself, SHORTFMT10).getTime();
        if (i >= s && i <= e) {
            flag = true;
        }
        return flag;
    }


    /**
     * 判断一个时分是否在当天的一个时分段内
     * 
     * @param String
     *            start < end ,itself 格式:HH:mm
     * @return boolean
     */
    public static boolean isInSpanHHmm(String start, String end,
            String itself) {
        boolean flag = false;
        int sHm = Integer.valueOf(start.replace(":", "")).intValue();
        int eHm = Integer.valueOf(end.replace(":", "")).intValue();
        int iHm = Integer.valueOf(itself.replace(":", "")).intValue();
        if (iHm >= sHm && iHm <= eHm) {
            flag = true;
        }
        return flag;
    }


    /**
     * 将一个日期类型的字符串转换成标准的日期字符串
     * 
     * @param String
     *            strDate: yyyyMMddHHmmss
     * @return normal String of date: yyyy-MM-dd HH:mm:ss
     */
    public static String toFormatDate(String strDate) {
        if (strDate != null && !strDate.isEmpty() && strDate.length() >= 14) {
            String yyyy = strDate.substring(0, 4);
            String MM = strDate.substring(4, 6);
            String dd = strDate.substring(6, 8);
            String HH = strDate.substring(8, 10);
            String mm = strDate.substring(10, 12);
            String ss = strDate.substring(12, 14);


            return yyyy + "-" + MM + "-" + dd + " " + HH + ":" + mm + ":" + ss;
        }
        return getNowString(LONGFMT19);
    }


    /**
     * 将一个日期类型的字符串转换成标准的日期字符串
     * 
     * @param String
     *            strDate: yyyyMMddHHmmss
     * @return normal String of date: yyyy-MM-dd HH:mm:ss
     */
    public static String toFormatDate(String strDate, String strTime) {
        StringBuilder builder = new StringBuilder();
        if (strDate != null && !strDate.isEmpty() && strTime != null
                && !strTime.isEmpty()) {
            builder.append(strDate.substring(0, strDate.length() - 4))
                    .append("-");
            builder.append(strDate.substring(strDate.length() - 4,
                    strDate.length() - 2)).append("-");
            builder.append(
                    strDate.substring(strDate.length() - 2, strDate.length()))
                    .append(" ");
            builder.append(strTime.substring(strTime.length() - 6,
                    strTime.length() - 4)).append(":");
            builder.append(strTime.substring(strTime.length() - 4,
                    strTime.length() - 2)).append(":");
            builder.append(
                    strTime.substring(strTime.length() - 2, strTime.length()));


            return builder.toString();
        }
        return getNowString(LONGFMT19);
    }


    /**
     * 将长日期格式的字符串截成短的日期字符串
     * 
     * @param String
     *            longDate: yyyy-MM-dd (HH:mm:ss)
     * @return String shortDate :yyyy-MM-dd
     */
    public static String getPartByLongStrdate(String longDate) {
        if (longDate != null && !longDate.isEmpty()
                && longDate.length() >= 10) {
            return longDate.substring(0, 10);
        }
        return getNowString(SHORTFMT10);
    }


    /**
     * 将长日期格式的字符串截成短的日期字符串
     * 
     * @param String
     *            longDate: yyyy-MM-dd HH:mm:ss
     * @return String backDate: HH:mm:ss
     */
    public static String getBackPartDate(String longDate) {
        if (longDate != null && !longDate.isEmpty()
                && longDate.length() >= 19) {
            return longDate.substring(11, 19);
        }
        return getNowString(SHORTFMTT8);
    }


    /**
     * 获取日期格式的年份数字
     * 
     * @param String
     *            strDate yyyy-MM-dd (HH:mm:ss)
     * @return int 4位数 参数据Error返回0
     */
    public static int getYearNum(String strDate) {
        if (strDate.length() >= 4) {
            return Integer.valueOf(strDate.substring(0, 4));
        }
        return 0;
    }


    /**
     * 获取日期格式的月份数字
     * 
     * @param String
     *            strDate yyyy-MM-dd (HH:mm:ss)
     * @return int 1-12 参数Error返回0
     */
    public static int getMonthNum(String strDate) {
        if (strDate.length() >= 8) {
            return Integer.valueOf(strDate.substring(5, 7));
        }
        return 0;
    }


    /**
     * 获取相对于当前时间第days天的日期
     * 
     * @param days:相对的天数,-1(昨天)、-2(往前2天)、0(当天)、1(明天)
     * @return yyyy-MM-dd
     */
    public static String getDayOfDate(String currDate, int days) {
        Calendar cal = Calendar.getInstance();
        Date time = strToDateByFmt(currDate, SHORTFMT10);
        cal.setTime(time);
        cal.add(Calendar.DAY_OF_MONTH, days);
        return dateToStringByFmt(cal.getTime(), SHORTFMT10);
    }


    /**
     * 获取相对于当前时间所在周的星期一的日期
     * 
     * @return yyyy-MM-dd
     */
    public static String getMondayOfWeek(String currDate) {
        Calendar cal = Calendar.getInstance();
        Date time = strToDateByFmt(currDate, SHORTFMT10);
        cal.setTime(time);


        // 判断要计算的日期是否是周日,如果是则减一天计算周六的,否则会出问题,计算到下一周去了
        int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天
        if (1 == dayWeek) {
            cal.add(Calendar.DAY_OF_MONTH, -1);
        }
        cal.setFirstDayOfWeek(Calendar.MONDAY);// 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一


        int day = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天
        cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);// 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值
        return dateToStringByFmt(cal.getTime(), SHORTFMT10);// 所在周星期一的日期
    }


    /**
     * 获取相对于当前时间所在周的星期日的日期
     * 
     * @return yyyy-MM-dd
     */
    public static String getSundayOfWeek(String currDate) {
        Calendar cal = Calendar.getInstance();
        Date time = strToDateByFmt(currDate, SHORTFMT10);
        cal.setTime(time);


        // 判断要计算的日期是否是周日,如果是则减一天计算周六的,否则会出问题,计算到下一周去了
        int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天
        if (1 == dayWeek) {
            cal.add(Calendar.DAY_OF_MONTH, -1);
        }
        cal.setFirstDayOfWeek(Calendar.MONDAY);// 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一


        int day = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天
        cal.add(Calendar.DATE, (6 + cal.getFirstDayOfWeek() - day));// 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值
        return dateToStringByFmt(cal.getTime(), SHORTFM
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。