DateUtils - genscript-lz/manufacturing GitHub Wiki

package com.genscript.gsscm.common.util;

import java.text.ParseException; import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.Locale; import java.util.TimeZone;

import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar;

import org.apache.commons.lang.StringUtils;

public class DateUtils {

/**
 * 静态常量
 */
public static final String C_TIME_PATTON_DEFAULT = "yyyy-MM-dd HH:mm:ss";

/**
 * 一天开始的时间格式 yyyy-MM-dd 00:00:00
 */
public static final String C_TIME_PATTON_START = "yyyy-MM-dd 00:00:00";

/**
 * 一天结束的时间格式 yyyy-MM-dd 23:59:59
 */
public static final String C_TIME_PATTON_END = "yyyy-MM-dd 23:59:59";

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

public static final String C_DATE_PATTON_DEFAULT_2 = "yyyy/MM/dd";

public static final String C_DATE_PATTON_DEFAULT_3 = "yyyy 年 MM 月 dd 日";

public static final int C_ONE_SECOND = 1000;

public static final int C_ONE_MINUTE = 60 * C_ONE_SECOND;

public static final long C_ONE_HOUR = 60 * C_ONE_MINUTE;

public static final long C_ONE_DAY = 24 * C_ONE_HOUR;

/**
 * 计算当前月份的最大天数
 * 
 * @return
 */
public static int findMaxDayInMonth() {
    return findMaxDayInMonth(0, 0);
}

/**
 * 计算指定日期月份的最大天数
 * 
 * @param date
 * @return
 */
public static int findMaxDayInMonth(Date date) {
    if (date == null) {
        return 0;
    }
    return findMaxDayInMonth(date2Calendar(date));
}

/**
 * 计算指定日历月份的最大天数
 * 
 * @param calendar
 * @return
 */
public static int findMaxDayInMonth(Calendar calendar) {
    if (calendar == null) {
        return 0;
    }

    return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
}

/**
 * 计算当前年某月份的最大天数
 * 
 * @param month
 * @return
 */
public static int findMaxDayInMonth(int month) {
    return findMaxDayInMonth(0, month);
}

/**
 * 计算某年某月份的最大天数
 * 
 * @param year
 * @param month
 * @return
 */
public static int findMaxDayInMonth(int year, int month) {
    Calendar calendar = Calendar.getInstance();
    if (year > 0) {
        calendar.set(Calendar.YEAR, year);
    }

    if (month > 0) {
        calendar.set(Calendar.MONTH, month - 1);
    }

    return findMaxDayInMonth(calendar);
}

/**
 * Calendar 转换为 Date
 * 
 * @param calendar
 * @return
 */
public static Date calendar2Date(Calendar calendar) {
    if (calendar == null) {
        return null;
    }
    return calendar.getTime();
}

/**
 * Date 转换为 Calendar
 * 
 * @param date
 * @return
 */
public static Calendar date2Calendar(Date date) {
    if (date == null) {
        return null;
    }
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    return calendar;
}

/**
 * 拿到默认格式的SimpleDateFormat
 * 
 * @return
 */
public static SimpleDateFormat getSimpleDateFormat() {
    return getSimpleDateFormat(null);
}

/**
 * 拿到指定输出格式的SimpleDateFormat
 * 
 * @param format
 * @return
 */
public static SimpleDateFormat getSimpleDateFormat(String format) {
    SimpleDateFormat sdf;
    if (format == null) {
        sdf = new SimpleDateFormat(C_TIME_PATTON_DEFAULT);
    } else {
        sdf = new SimpleDateFormat(format);
    }

    return sdf;
}

/**
 * 转换当前时间为默认格式
 * 
 * @return
 */
public static String formatDate2Str() {
    return formatDate2Str(new Date());
}

/**
 * 转换指定时间为默认格式
 * 
 * @param date
 * @return
 */
public static String formatDate2Str(Date date) {
    return formatDate2Str(date, C_TIME_PATTON_DEFAULT);
}

/**
 * 某天最大时间
 * 
 * @param date
 * @return
 */
public static String formatMaxDate2Str(Date date) {
    String date_str = formatDate2Str(date, C_TIME_PATTON_DEFAULT);
    return date_str.split(" ")[0] + " 23:59:59";
}

/**
 * 某天最小时间
 * 
 * @param date
 * @return
 */
public static String formatMinDate2Str(Date date) {
    String date_str = formatDate2Str(date, C_TIME_PATTON_DEFAULT);
    return date_str.split(" ")[0] + " 00:00:00";
}

/**
 * 转换指定时间为指定格式
 * 
 * @param date
 * @param format
 * @return
 */
public static String formatDate2Str(Date date, String format) {
    if (date == null) {
        return null;
    }

    if (format == null || format.equals("")) {
        format = C_TIME_PATTON_DEFAULT;
    }
    SimpleDateFormat sdf = getSimpleDateFormat(format);
    return sdf.format(date);
}

public static Date _toDate(String date, Integer _count) {
    String[] dateFormats = { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "MM/dd/YYYY" };
    try {
        if (_count == dateFormats.length) {
            return null;
        }
        return DateUtils.formatStr2Date(date, dateFormats[_count]);
    } catch (Exception e) {
        return _toDate(date, ++_count);
    }
}

/**
 * 转换默认格式的时间为Date
 * 
 * @param dateStr
 * @return
 */
public static Date formatStr2Date(String dateStr) {
    return formatStr2Date(dateStr, null);
}

/**
 * 转换指定格式的时间为Date
 * 
 * @param dateStr
 * @param format
 * @return
 */
public static Date formatStr2Date(String dateStr, String format) {
    if (dateStr == null) {
        return null;
    }

    if (format == null || format.equals("")) {
        format = C_TIME_PATTON_DEFAULT;
    }
    SimpleDateFormat sdf = getSimpleDateFormat(format);
    Date returnDate = sdf.parse(dateStr, new ParsePosition(0));
    if (returnDate == null) {
        sdf = getSimpleDateFormat(C_DATE_PATTON_DEFAULT);
        returnDate = sdf.parse(dateStr, new ParsePosition(0));
    }
    if (returnDate == null) {
        sdf = getSimpleDateFormat(C_DATE_PATTON_DEFAULT_2);
        returnDate = sdf.parse(dateStr, new ParsePosition(0));
    }
    if (returnDate == null) {
        sdf = getSimpleDateFormat(C_DATE_PATTON_DEFAULT_3);
        returnDate = sdf.parse(dateStr, new ParsePosition(0));
    }
    return returnDate;
}

/**
 * 转换默认格式的时间为指定格式时间
 * 
 * @param dateStr
 * @param defineFormat
 * @return
 */
public static String formatDefault2Define(String dateStr, String defineFormat) {
    return formatSource2Target(dateStr, C_TIME_PATTON_DEFAULT, defineFormat);
}

/**
 * 转换源格式的时间为目标格式时间
 * 
 * @param dateStr
 * @param sourceFormat
 * @param targetFormat
 * @return
 */
public static String formatSource2Target(String dateStr, String sourceFormat, String targetFormat) {
    Date date = formatStr2Date(dateStr, sourceFormat);
    return formatDate2Str(date, targetFormat);
}

/**
 * 计算当天是该年中的第几周
 * 
 * @return
 */
public static int findWeeksNoInYear() {
    return findWeeksNoInYear(new Date());
}

/**
 * 计算指定日期是该年中的第几周
 * 
 * @param date
 * @return
 */
public static int findWeeksNoInYear(Date date) {
    if (date == null) {
        return 0;
    }
    return findWeeksNoInYear(date2Calendar(date));
}

/**
 * 计算指定日历是该年中的第几周
 * 
 * @param calendar
 * @return
 */
public static int findWeeksNoInYear(Calendar calendar) {
    if (calendar == null) {
        return 0;
    }
    return calendar.get(Calendar.WEEK_OF_YEAR);
}

/**
 * 计算一年中的第几星期是几号
 * 
 * @param year
 * @param weekInYear
 * @param dayInWeek
 * @return
 */
public static Date findDateInWeekOnYear(int year, int weekInYear, int dayInWeek) {
    Calendar calendar = Calendar.getInstance();
    if (year > 0) {
        calendar.set(Calendar.YEAR, year);
    }

    calendar.set(Calendar.WEEK_OF_YEAR, weekInYear);
    calendar.set(Calendar.DAY_OF_WEEK, dayInWeek);

    return calendar.getTime();
}

/**
 * 相对于当前日期的前几天(days < 000000)或者后几天(days > 0)
 * 
 * @param days
 * @return
 */
public static Date dayBefore2Date(int days) {
    Date date = new Date();
    return dayBefore2Object(days, null, date);
}

/**
 * 相对于指定日期的前几天(days < 000000)或者后几天(days > 0)
 * 
 * @author wangsf
 * @param days
 * @return
 */
public static Date dayBefore2Date(Date date, int days) {
    return dayBefore2Object(days, null, date);
}

/**
 * 相对于指定日期的前几小时(hours < 000000)或者后几小时(hours > 0)
 * 
 * @author wangsf
 * @param days
 * @return
 */
public static Date hoursBefore2Date(Date date, int hours) {
    return hoursBefore2Object(hours, null, date);
}

/**
 * 相对于当前日期的前几天(days < 000000)或者后几天(days > 0)
 * 
 * @param days
 * @return
 */
public static String dayBefore2Str(int days) {
    String string = formatDate2Str();
    return dayBefore2Object(days, null, string);
}

/**
 * 相对于当前日期的前几天(days < 000000)或者后几天(days > 0)
 * 
 * @author wangsf
 * @param days
 * @param format
 * @param instance
 */
@SuppressWarnings("unchecked")
public static <T extends Object> T dayBefore2Object(int days, String format, T instance) {
    Calendar calendar = Calendar.getInstance();
    if (format == null || format.equals("")) {
        format = C_TIME_PATTON_DEFAULT;
    }
    if (instance instanceof Date) {
        calendar.setTime((Date) instance);
        calendar.add(Calendar.DATE, days);// 增加x天
        Date date = calendar.getTime();
        return (T) date;
    } else if (instance instanceof String) {
        calendar.add(Calendar.DATE, days);
        return (T) formatDate2Str(calendar2Date(calendar), format);
    }
    return null;
}

/**
 * 相对于当前日期的前几小时(hours < 000000)或者后几小时(hours > 0)
 * 
 * @author wangsf
 * @param days
 * @param format
 * @param instance
 */
@SuppressWarnings("unchecked")
public static <T extends Object> T hoursBefore2Object(int hours, String format, T instance) {
    Calendar calendar = Calendar.getInstance();
    if (format == null || format.equals("")) {
        format = C_TIME_PATTON_DEFAULT;
    }
    if (instance instanceof Date) {
        calendar.setTime((Date) instance);
        calendar.add(Calendar.HOUR_OF_DAY, hours);// 增加x天
        Date date = calendar.getTime();
        return (T) date;
    } else if (instance instanceof String) {
        calendar.add(Calendar.HOUR_OF_DAY, hours);
        return (T) formatDate2Str(calendar2Date(calendar), format);
    }
    return null;
}

/**
 * 相对于指定日期的前几天(days < 000000)或者后几天(days > 0)
 * 
 * @param date
 * @param days
 * @return
 */
public static Date defineDayBefore2Date(Date date, int days) {
    Date dateInstance = new Date();
    return defineDayBefore2Object(date, days, null, dateInstance);
}

/**
 * 相对于指定日期的前几天(days < 000000)或者后几天(days > 0)
 * 
 * @param date
 * @param days
 * @return
 */
public static String defineDayBefore2Str(Date date, int days) {
    String stringInstance = formatDate2Str();
    return defineDayBefore2Object(date, days, null, stringInstance);
}

public static String defineDayBefore2Str(Date date, int days, String format) {
    String stringInstance = formatDate2Str();
    return defineDayBefore2Object(date, days, format, stringInstance);
}

/**
 * 相对于指定日期的前几天(days < 000000)或者后几天(days > 0)
 * 
 * @param <T>
 * @param date
 * @param days
 * @param format
 * @param instance
 * @return
 */
@SuppressWarnings("unchecked")
public static <T extends Object> T defineDayBefore2Object(Date date, int days, String format, T instance) {
    if (date == null || days == 0) {
        return null;
    }

    if (format == null || format.equals("")) {
        format = C_TIME_PATTON_DEFAULT;
    }

    Calendar calendar = date2Calendar(date);
    calendar.add(Calendar.DATE, days);
    if (instance instanceof Date) {
        return (T) calendar.getTime();
    } else if (instance instanceof String) {
        return (T) formatDate2Str(calendar2Date(calendar), format);
    }
    return null;
}

/**
 * 相对于当前日期的前几月(months < 000000)或者后几月(months > 0)时间
 * 
 * @param months
 * @return
 */
public static Date monthBefore2Date(int months) {
    Date date = new Date();
    return monthBefore2Object(months, null, date);
}

/**
 * 相对于当前日期的前几月(months < 000000)或者后几月(months > 0)时间
 * 
 * @param months
 * @return
 */
public static String monthBefore2Str(int months) {
    String string = formatDate2Str();
    return monthBefore2Object(months, null, string);
}

/**
 * 相对于当前日期的前几月(months < 000000)或者后几月(months > 0)时间
 * 
 * @param <T>
 * @param months
 * @param format
 * @param instance
 */
@SuppressWarnings("unchecked")
public static <T extends Object> T monthBefore2Object(int months, String format, T instance) {
    if (months == 0) {
        return null;
    }

    if (format == null || format.equals("")) {
        format = C_TIME_PATTON_DEFAULT;
    }
    Calendar calendar = Calendar.getInstance();
    calendar.add(Calendar.MONTH, months);

    if (instance instanceof Date) {
        return (T) calendar.getTime();
    } else if (instance instanceof String) {
        return (T) formatDate2Str(calendar2Date(calendar), format);
    }

    return null;
}

/**
 * 相对于指定日期的前几月(months < 000000)或者后几月(months > 0)时间
 * 
 * @param date
 * @param months
 * @return
 */
public static Date defineMonthBefore2Date(Date date, int months) {
    Date dateInstance = new Date();
    return defineMonthBefore2Object(date, months, null, dateInstance);
}

/**
 * 相对于指定日期的前几月(months < 000000)或者后几月(months > 0)时间
 * 
 * @param date
 * @param months
 * @return
 */
public static String defineMonthBefore2Str(Date date, int months) {
    String stringInstance = formatDate2Str();
    return defineMonthBefore2Object(date, months, null, stringInstance);
}

/**
 * 相对于指定日期的前几月(months < 000000)或者后几月(months > 0)时间
 * 
 * @param <T>
 * @param date
 * @param months
 * @param format
 * @param instance
 * @return
 */
@SuppressWarnings("unchecked")
public static <T extends Object> T defineMonthBefore2Object(Date date, int months, String format, T instance) {
    if (months == 0) {
        return null;
    }

    if (format == null || format.equals("")) {
        format = C_TIME_PATTON_DEFAULT;
    }

    Calendar calendar = date2Calendar(date);
    calendar.add(Calendar.MONTH, months);

    if (instance instanceof Date) {
        return (T) calendar.getTime();
    } else if (instance instanceof String) {
        return (T) formatDate2Str(calendar2Date(calendar), format);
    }

    return null;
}

/**
 * 计算两个日期直接差的天数
 * 
 * 这个计算有错误,只能计算一年之内的,不能跨年
 * 
 * @param firstDate
 * @param secondDate
 * @return
 */
public static int caculate2Days(Date firstDate, Date secondDate) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(firstDate);
    int dayNum1 = calendar.get(Calendar.DAY_OF_YEAR);
    calendar.setTime(secondDate);
    int dayNum2 = calendar.get(Calendar.DAY_OF_YEAR);
    return Math.abs(dayNum1 - dayNum2);
}

public static int caculateDays(Date firstDate, Date secondDate) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(firstDate);
    long first = calendar.getTimeInMillis();
    calendar.setTime(secondDate);
    long second = calendar.getTimeInMillis();
    return (int) Math.abs((first - second) / (1000 * 60 * 60 * 24));
}

/**
 * 计算两个日期直接差的天数 ,返回有正负
 * 
 * @param firstDate
 * @param secondDate
 * @return
 */
public static int caculate2DaysOther(Date firstDate, Date secondDate) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(firstDate);
    int dayNum1 = calendar.get(Calendar.DAY_OF_YEAR);
    calendar.setTime(secondDate);
    int dayNum2 = calendar.get(Calendar.DAY_OF_YEAR);
    return dayNum1 - dayNum2;
}

/**
 * 计算两个日期直接差天数精确值 考虑到年。
 * 
 * @param firstDate
 * @param secondDate
 * @return
 */
public static int caculate2days(Date firstDate, Date secondDate) {

    // 默认为毫秒,除以1000是为了转换成秒
    long interval = (firstDate.getTime() - secondDate.getTime()) / 1000;// 秒
    long day = interval / (24 * 3600);// 天
    long hour = interval % (24 * 3600) / 3600;// 小时
    long minute = interval % 3600 / 60;// 分钟
    long second = interval % 60;// 秒
    if (hour > 0 || minute > 0 || second > 0) {
        day++;
    }
    return (int) day;
}

/**
 * 计算两个日期直接差的天数
 * 
 * @param firstCalendar
 * @param secondCalendar
 * @return
 */
public static int caculate2Days(Calendar firstCalendar, Calendar secondCalendar) {
    if (firstCalendar.after(secondCalendar)) {
        Calendar calendar = firstCalendar;
        firstCalendar = secondCalendar;
        secondCalendar = calendar;
    }

    long calendarNum1 = firstCalendar.getTimeInMillis();
    long calendarNum2 = secondCalendar.getTimeInMillis();
    return Math.abs((int) ((calendarNum1 - calendarNum2) / C_ONE_DAY));
}

/**
 * @author wangsf 获得当前日期所在周的最后一天.
 * @return
 */
public static Date getWeekEndDay(final Date fromDate) {
    Date toDate = null;
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(fromDate);
    int tempWeek = calendar.get(Calendar.DAY_OF_WEEK);
    if (tempWeek == 1) {
        toDate = fromDate;
    } else {
        tempWeek = 7 - (tempWeek - 1);
        toDate = DateUtils.defineDayBefore2Object(fromDate, tempWeek, DateUtils.C_DATE_PATTON_DEFAULT, new Date());
    }
    return toDate;
}

/**
 * @author wangsf 获得当前日期所在月的最后一天.
 * @return
 */
public static Date getMonthEndDay(final Date fromDate) {
    Date toDate = null;
    int maxDay = DateUtils.findMaxDayInMonth(fromDate);
    String fromDateStr = DateUtils.formatDate2Str(fromDate, "yyyy-MM-dd");
    String maxDayStr = maxDay < 10 ? "0" + maxDay : "" + maxDay;
    toDate = DateUtils.formatStr2Date(fromDateStr.substring(0, 8) + maxDayStr, "yyyy-MM-dd");
    return toDate;
}

/**
 * @author wangsf 获得当前日期所在季度的最后一天.
 * @return
 */
public static Date getQuarterEndDay(final Date fromDate) {
    Date toDate = null;
    String fromDateStr = DateUtils.formatDate2Str(fromDate, "yyyy-MM-dd");
    int iMonth = Integer.parseInt(fromDateStr.substring(5, 7));
    int iMaxMonth = iMonth + 2;
    /*
     * if (iMonth <= 3) { iMaxMonth = 3; } else if (iMonth <= 6) { iMaxMonth
     * = 6; } else if (iMonth <= 9) { iMaxMonth = 9; } else { iMaxMonth =
     * 12; }
     */
    String monthStr = iMonth < 10 ? "0" + iMaxMonth : "" + iMaxMonth;
    Date quarter = DateUtils.formatStr2Date(fromDateStr.substring(0, 5) + monthStr, "yyyy-MM");
    int maxDay = DateUtils.findMaxDayInMonth(quarter);
    toDate = DateUtils.formatStr2Date(fromDateStr.substring(0, 5) + monthStr + "-" + maxDay, "yyyy-MM-dd");
    return toDate;
}

/**
 * @author mingrs 获得当前日期所在季度的第一天.
 * @return
 */
public static Date getQuarterStartDay(final Date fromDate) {
    Date toDate = null;
    String fromDateStr = DateUtils.formatDate2Str(fromDate, "yyyy-MM-dd");
    int iMonth = Integer.parseInt(fromDateStr.substring(5, 7));
    int iMaxMonth = iMonth;
    /*
     * if (iMonth <= 3) { iMaxMonth = 1; } else if (iMonth <= 6) { iMaxMonth
     * = 4; } else if (iMonth <= 9) { iMaxMonth = 7; } else { iMaxMonth =
     * 10; }
     */
    String monthStr = iMonth < 10 ? "0" + iMaxMonth : "" + iMaxMonth;
    toDate = DateUtils.formatStr2Date(fromDateStr.substring(0, 5) + monthStr + "-" + "01", "yyyy-MM-dd");
    return toDate;
}

/**
 * @author mingrs 获得当前日期所在半年的最后一天.
 * @return
 */
public static Date getLast6MonthsEndDay(final Date fromDate) {
    Date toDate = null;
    String fromDateStr = DateUtils.formatDate2Str(fromDate, "yyyy-MM-dd");
    int iMonth = Integer.parseInt(fromDateStr.substring(5, 7));
    int iMaxMonth = iMonth + 5;
    /*
     * if (iMonth <= 6) { iMaxMonth = 6; } else { iMaxMonth = 12; }
     */
    String monthStr = iMonth < 10 ? "0" + iMaxMonth : "" + iMaxMonth;
    Date quarter = DateUtils.formatStr2Date(fromDateStr.substring(0, 5) + monthStr, "yyyy-MM");
    int maxDay = DateUtils.findMaxDayInMonth(quarter);
    toDate = DateUtils.formatStr2Date(fromDateStr.substring(0, 5) + monthStr + "-" + maxDay, "yyyy-MM-dd");
    return toDate;
}

/**
 * @author mingrs 获得当前日期所在半年的第一天.
 * @return
 */
public static Date getLast6MonthsStartDay(final Date fromDate) {
    Date toDate = null;
    String fromDateStr = DateUtils.formatDate2Str(fromDate, "yyyy-MM-dd");
    int iMonth = Integer.parseInt(fromDateStr.substring(5, 7));
    int iMaxMonth = iMonth;
    /*
     * if (iMonth <= 6) { iMaxMonth = 1; } else { iMaxMonth = 7; }
     */
    String monthStr = iMonth < 10 ? "0" + iMaxMonth : "" + iMaxMonth;
    // Date quarter = DateUtils.formatStr2Date(fromDateStr.substring(0, 5)
    // + monthStr, "yyyy-MM");
    toDate = DateUtils.formatStr2Date(fromDateStr.substring(0, 5) + monthStr + "-" + "01", "yyyy-MM-dd");
    return toDate;
}

/**
 * @author wangsf 获得当前日期所在年的最后一天.
 * @return
 */
public static Date getYearEndDay(final Date fromDate) {
    Date toDate = null;
    String fromDateStr = DateUtils.formatDate2Str(fromDate, "yyyy-MM-dd");
    Date lastMonth = DateUtils.formatStr2Date(fromDateStr.substring(0, 5) + "12", "yyyy-MM");
    int maxDay = DateUtils.findMaxDayInMonth(lastMonth);
    toDate = DateUtils.formatStr2Date(fromDateStr.substring(0, 5) + 12 + "-" + maxDay, "yyyy-MM-dd");
    return toDate;
}

/**
 * @author mingrs 获得当前日期所在年的第一天.
 * @return
 */
public static Date getYearStartDay(final Date fromDate) {
    Date toDate = null;
    String fromDateStr = DateUtils.formatDate2Str(fromDate, "yyyy-MM-dd");
    toDate = DateUtils.formatStr2Date(fromDateStr.substring(0, 5) + 01 + "-" + 01, "yyyy-MM-dd");
    return toDate;
}

/**
 * 根据传过来的时间值返回AM, 或PM;
 * 
 * @param time 如: 08:00:00
 * @return
 */
public static String getAPM(String time) {
    if (time == null || time.trim().length() < 1) {
        return "";
    }
    if (time.equals("12:00:00")) {
        return "AM";
    }
    Integer hTime = Integer.parseInt(time.substring(0, 2));
    if (hTime >= 12) {
        return "PM";
    }
    return "AM";
}

/**
 * 根据传过来的时间返回AM,PM对应的值, 并保留相应长度.
 * 
 * @param time 如: 08:00:00
 * @param length 如: 5,则返回 08:00;
 * @return
 */
public static String getAPMTime(String time, int length) {
    if (time == null || time.trim().length() < 1) {
        return "";
    }
    String amPm = DateUtils.getAPM(time);
    Integer hTime = Integer.parseInt(time.substring(0, 2));
    String minAndSec = time.substring(2);
    String realTime;
    if (amPm.equalsIgnoreCase("AM")) {
        realTime = time;
    } else {
        hTime = hTime - 12;
        if (hTime < 10) {
            realTime = "0" + hTime + minAndSec;
        } else {
            realTime = hTime + minAndSec;
        }
    }
    realTime = realTime.substring(0, length);
    return realTime;
}

public static String apmStr2Time(String timeStr, String apm) {
    if (timeStr == null || timeStr.trim().length() < 1 || apm == null) {
        return null;
    }
    String realTime;
    if (apm.equalsIgnoreCase("AM")) {
        realTime = timeStr;
    } else {
        String minAndSec = timeStr.substring(2);
        Integer hTime = Integer.parseInt(timeStr.substring(0, 2));
        hTime = hTime + 12;
        realTime = hTime + minAndSec;
    }
    realTime += ":00";
    if (realTime.equals("24:00:00")) {
        return "00:00:00";
    }
    return realTime;
}

private static int getMondayPlus() {
    Calendar cd = Calendar.getInstance();
    // 获得今天是一周的第几天,星期日是第一天,星期二是第二天......
    int dayOfWeek = cd.get(Calendar.DAY_OF_WEEK);
    if (dayOfWeek == 1) {
        return -6;
    } else {
        return 2 - dayOfWeek;
    }
}

/**
 * 获得上周星期一的日期
 * 
 * @author golf
 * @return String
 */
public static String getPreviousMonday() {
    int mondayPlus = getMondayPlus();
    GregorianCalendar currentDate = new GregorianCalendar();
    currentDate.add(GregorianCalendar.DATE, mondayPlus - 7);
    Date monday = currentDate.getTime();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    String preMonday = sdf.format(monday);
    return preMonday;
}

/**
 * 获得上周星期日的日期
 * 
 * @author golf
 * @return String
 */
public static String getPreviousSunday() {
    int mondayPlus = getMondayPlus();
    GregorianCalendar currentDate = new GregorianCalendar();
    currentDate.add(GregorianCalendar.DATE, mondayPlus - 1);
    Date monday = currentDate.getTime();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    String preSunday = sdf.format(monday);
    return preSunday;
}

/**
 * 获得本周星期一的日期
 * 
 * @author golf
 * @return
 */
public static String getCurrentMonday() {
    int mondayPlus = getMondayPlus();
    GregorianCalendar currentDate = new GregorianCalendar();
    currentDate.add(GregorianCalendar.DATE, mondayPlus);
    Date monday = currentDate.getTime();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    String currMonday = sdf.format(monday);
    return currMonday;
}

/**
 * 
 * @Description: 获得本周星期日的日期 @author WangXiao @param @return String @throws
 */
public static String getCurrentSunday() {
    int mondayPlus = getMondayPlus();
    GregorianCalendar currentDate = new GregorianCalendar();
    currentDate.add(GregorianCalendar.DATE, mondayPlus + 6);
    Date monday = currentDate.getTime();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    String preMonday = sdf.format(monday);
    return preMonday;
}

/**
 * 获得上月的第一天的日期
 * 
 * @author golf
 * @return
 */
public static String getLastMonth() {
    GregorianCalendar currentDate = new GregorianCalendar();
    currentDate.add(GregorianCalendar.MONTH, -1);
    currentDate.set(GregorianCalendar.DAY_OF_MONTH, 1);
    Date day = currentDate.getTime();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    String lastMonth = sdf.format(day);
    return lastMonth;
}

/**
 * 取得指定月份的第一天
 * 
 * @author golf
 * @param strdate String
 * @return String
 */
public static String getFirstDayOfMonth(Date date) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.set(Calendar.DAY_OF_MONTH, 1);
    Date day = cal.getTime();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    return sdf.format(day);
}

/**
 * 取得指定月份的最后一天
 * 
 * @author golf
 * @param strdate String
 * @return String
 */
public static String getLastDayOfMonth(Date date) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.set(Calendar.DAY_OF_MONTH, 1);
    cal.roll(Calendar.DAY_OF_MONTH, -1);
    Date day = cal.getTime();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    return sdf.format(day);
}

/*
 * public static void main(String[] args) { //
 * System.out.println("当前月份的最大天数:" + findMaxDayInMonth(new Date())); //
 * System.out.println("6月份的最大天数:" + findMaxDayInMonth(6)); //
 * System.out.println("1999-02月份的最大天数:" + findMaxDayInMonth(1999, 2)); //
 * System.out.println("2000-02月份的最大天数:" + findMaxDayInMonth(2000, 2));
 * 
 * // System.out.println(formatSource2Target("2009-07-24 11:02:35", null, //
 * "yyyy/MM/dd")); // System.out.println(findWeeksNoInYear());
 * 
 * // System.out.println("2003年的第30个星期一是那天:" + findDateInWeekOnYear(2003, //
 * 30, Calendar.MONDAY)); // System.out.println("2009年的第30个星期一是那天:" +
 * findDateInWeekOnYear(2009, // 30, Calendar.FRIDAY));
 * 
 * // System.out.println("【日期格式】当前日期的前7天是:" + dayBefore2Date(-7)); //
 * System.out.println("【字符格式】当前日期的前7天是:" + dayBefore2Str(-7)); //
 * System.out.println("【日期格式】当前日期的后7天是:" + dayBefore2Date(7)); //
 * System.out.println("【字符格式】当前日期的后7天是:" + dayBefore2Str(7));
 * 
 * // System.out.println(formatStr2Date("2009-07-22", "yyyy-MM-dd"));
 * 
 * // System.out.println("【日期格式】2009-07-22的前7天是:" + //
 * defineDayBefore2Date(formatStr2Date("2009-07-22", "yyyy-MM-dd"), // -7));
 * // System.out.println("【字符格式】2009-07-22的前7天是:" + //
 * defineDayBefore2Str(formatStr2Date("2009-07-22", "yyyy-MM-dd"), -7)); //
 * System.out.println("【日期格式】2009-07-22的后7天是:" + //
 * defineDayBefore2Date(formatStr2Date("2009-07-22", "yyyy-MM-dd"), 7)); //
 * System.out.println("【字符格式】2009-07-22的后7天是:" + //
 * defineDayBefore2Str(formatStr2Date("2009-07-22", "yyyy-MM-dd"), 7));
 * 
 * // System.out.println("【日期格式】相对于当前时间的前2月日期是:" + monthBefore2Date(-2)); //
 * System.out.println("【字符格式】相对于当前时间的前2月日期是:" + monthBefore2Date(-2)); //
 * System.out.println("【日期格式】相对于当前时间的后2月日期是:" + monthBefore2Date(2)); //
 * System.out.println("【字符格式】相对于当前时间的后2月日期是:" + monthBefore2Date(2));
 * 
 * // System.out.println("【日期格式】2009-07-22的前2月日期是:" + //
 * defineMonthBefore2Date(formatStr2Date("2009-07-22", "yyyy-MM-dd"), //
 * -2)); // System.out.println("【字符格式】2009-07-22的前2月日期是:" + //
 * defineMonthBefore2Date(formatStr2Date("2009-07-22", "yyyy-MM-dd"), //
 * -2)); // System.out.println("【日期格式】2009-07-22的后2月日期是:" + //
 * defineMonthBefore2Date(formatStr2Date("2009-07-22", "yyyy-MM-dd"), //
 * 2)); // System.out.println("【字符格式】2009-07-22的后2月日期是:" + //
 * defineMonthBefore2Date(formatStr2Date("2009-07-22", "yyyy-MM-dd"), //
 * 2));
 * 
 * // Date firstDate = formatStr2Date("2009-07-22", "yyyy-MM-dd"); // Date
 * secondDate = formatStr2Date("2009-07-18", "yyyy-MM-dd"); //
 * System.out.println(caculate2Days(firstDate, secondDate));
 * 
 * Calendar firstC = date2Calendar(formatStr2Date("2009-07-22",
 * "yyyy-MM-dd")); Calendar secondC =
 * date2Calendar(formatStr2Date("2009-07-18", "yyyy-MM-dd"));
 * System.out.println(caculate2Days(firstC, secondC)); }
 */

/**
 * 说明:把Date对象转为XMLGregorianCalendar
 * 
 * @author Golf
 * 
 * @return XMLGregorianCalendar
 */
public static XMLGregorianCalendar convertToXMLGregorianCalendar(Date date) {
    if (date != null) {
        GregorianCalendar cal = new GregorianCalendar();
        cal.setTime(date);
        XMLGregorianCalendar gc = null;
        try {
            gc = DatatypeFactory.newInstance().newXMLGregorianCalendar(cal);
        } catch (Exception e) {

            e.printStackTrace();
        }
        return gc;
    }
    return null;
}

/**
 * fangquan 根据某年的第几周得到开始和结束日期
 */
public static String[] getWeeklyDate(int year, int week) {
    String[] s = new String[2];
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    Calendar calFirstDayOfTheYear = new GregorianCalendar(year, Calendar.JANUARY, 1);
    calFirstDayOfTheYear.add(Calendar.DATE, 7 * (week));
    int dayOfWeek = calFirstDayOfTheYear.get(Calendar.DAY_OF_WEEK);
    Calendar calFirstDayInWeek = (Calendar) calFirstDayOfTheYear.clone();
    calFirstDayInWeek.add(Calendar.DATE, calFirstDayOfTheYear.getActualMinimum(Calendar.DAY_OF_WEEK) - dayOfWeek);
    Date firstDayInWeek = calFirstDayInWeek.getTime();
    s[0] = df.format(firstDayInWeek);
    Calendar calLastDayInWeek = (Calendar) calFirstDayOfTheYear.clone();
    calLastDayInWeek.add(Calendar.DATE, calFirstDayOfTheYear.getActualMaximum(Calendar.DAY_OF_WEEK) - dayOfWeek);
    Date lastDayInWeek = calLastDayInWeek.getTime();
    s[1] = df.format(lastDayInWeek);
    return s;
}

/**
 * fangquan 根据某年的第几周得到开始和结束日期
 */
public static String[] getWeeklyDate2(int year, int week) {
    String[] s = new String[2];
    SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd");
    Calendar calFirstDayOfTheYear = new GregorianCalendar(year, Calendar.JANUARY, 1);
    calFirstDayOfTheYear.add(Calendar.DATE, 7 * (week));
    int dayOfWeek = calFirstDayOfTheYear.get(Calendar.DAY_OF_WEEK);
    Calendar calFirstDayInWeek = (Calendar) calFirstDayOfTheYear.clone();
    calFirstDayInWeek.add(Calendar.DATE, calFirstDayOfTheYear.getActualMinimum(Calendar.DAY_OF_WEEK) - dayOfWeek);
    Date firstDayInWeek = calFirstDayInWeek.getTime();
    s[0] = df.format(firstDayInWeek);
    Calendar calLastDayInWeek = (Calendar) calFirstDayOfTheYear.clone();
    calLastDayInWeek.add(Calendar.DATE, calFirstDayOfTheYear.getActualMaximum(Calendar.DAY_OF_WEEK) - dayOfWeek);
    Date lastDayInWeek = calLastDayInWeek.getTime();
    s[1] = df.format(lastDayInWeek);
    return s;
}

/**
 * fangquan 根据某年的第几月得到开始和结束日期
 */
public static String[] getMonthlyDate2(int year, int month) {
    String[] s = new String[2];
    SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd");
    Date date = formatStr2Date(year + "-" + month + "-01", "yyyy-MM-dd");
    s[0] = df.format(date);
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.add(Calendar.MONTH, 1);
    calendar.add(Calendar.DAY_OF_YEAR, -1);
    s[1] = df.format(calendar.getTime());
    return s;
}

/**
 * 
 * @Description: 计算任意2个日期内的自然日(没有考虑到国定假日) @author WangXiao @param d1 @param
 *               d2 @param @return @return int @throws
 */
public static int getDaysBetween(java.util.Calendar d1, java.util.Calendar d2) {
    if (d1.after(d2)) { // swap dates so that d1 is start and d2 is end
        java.util.Calendar swap = d1;
        d1 = d2;
        d2 = swap;
    }
    int days = d2.get(java.util.Calendar.DAY_OF_YEAR) - d1.get(java.util.Calendar.DAY_OF_YEAR);
    int y2 = d2.get(java.util.Calendar.YEAR);
    if (d1.get(java.util.Calendar.YEAR) != y2) {
        d1 = (java.util.Calendar) d1.clone();
        do {
            days += d1.getActualMaximum(java.util.Calendar.DAY_OF_YEAR);
            d1.add(java.util.Calendar.YEAR, 1);
        } while (d1.get(java.util.Calendar.YEAR) != y2);
    }
    return days;
}

/**
 * 
 * @Description: 计算2个日期之间的工作日天数 @author WangXiao @param d1 @param
 *               d2 @param @return @return int @throws
 */
public static int getWorkingDay(java.util.Calendar d1, java.util.Calendar d2) {
    int result = -1;
    if (d1.after(d2)) { // swap dates so that d1 is start and d2 is end
        java.util.Calendar swap = d1;
        d1 = d2;
        d2 = swap;
    }
    int charge_start_date = 0;// 开始日期的日期偏移量
    int charge_end_date = 0;// 结束日期的日期偏移量
    // 日期不在同一个日期内
    int stmp;
    int etmp;
    stmp = 7 - d1.get(Calendar.DAY_OF_WEEK);
    etmp = 7 - d2.get(Calendar.DAY_OF_WEEK);
    if (stmp != 0 && stmp != 6) {// 开始日期为星期六和星期日时偏移量为0
        charge_start_date = stmp - 1;
    }
    if (etmp != 0 && etmp != 6) {// 结束日期为星期六和星期日时偏移量为0
        charge_end_date = etmp - 1;
    }
    result = (getDaysBetween(getNextMonday(d1), getNextMonday(d2)) / 7) * 5 + charge_start_date - charge_end_date;
    return result;
}

public static String getChineseWeek(Calendar date) {
    final String dayNames[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
    int dayOfWeek = date.get(Calendar.DAY_OF_WEEK);
    return dayNames[dayOfWeek - 1];
}

/**
 * 
 * @Description: 获得下周一日期 @author WangXiao @param date @param @return @return
 *               Calendar @throws
 */
public static Calendar getNextMonday(Calendar date) {
    Calendar result = null;
    result = date;
    do {
        result = (Calendar) result.clone();
        result.add(Calendar.DATE, 1);
    } while (result.get(Calendar.DAY_OF_WEEK) != 2);
    return result;
}

/**
 * 
 * @Description: 计算两个日期之间的休息日 @author WangXiao @param d1 @param
 *               d2 @param @return @return int @throws
 */
public static int getHolidays(Calendar d1, Calendar d2) {
    return getDaysBetween(d1, d2) - getWorkingDay(d1, d2);
}

/**
 * @author WangXiao
 * @param 19位的时间 yyyy-MM-dd HH:mm:ss
 * @return 15位的时间 yyyyMMdd HHmmss
 */
public static String time19To15(String time_19) {
    String time_15 = "";
    if (time_19 == null || "".equals(time_19) || time_19.length() != 19) {
        time_15 = "";
    } else {
        String[] r = time_19.replace('-', '#').replace(':', '#').split("#");
        for (int i = 0; i < r.length; i++) {
            time_15 += r[i];
        }
    }
    return time_15;
}

/**
 * @author WangXiao
 * @param 15位的时间 yyyyMMdd HHmmss
 * @return 19位的时间 yyyy-MM-dd HH:mm:ss
 */
public static String time15To19(String time_15) {
    String time_19 = "";
    if (time_15 == null || "".equals(time_15) || time_15.length() != 15) {
        time_19 = "";
    } else {
        String y = time_15.substring(0, 4);
        String m = time_15.substring(4, 6);
        String d = time_15.substring(6, 8);
        String h = time_15.substring(9, 11);
        String mi = time_15.substring(11, 13);
        String s = time_15.substring(13, 15);
        time_19 = y + "-" + m + "-" + d + " " + h + ":" + mi + ":" + s;
    }
    return time_19;
}

/**
 * @author WangXiao
 * @param 16位的时间 yyyy-MM-dd HH:mm
 * @return 13位的时间 yyyyMMdd HHmm
 */
public static String time16To13(String time_16) {
    String time_13 = "";
    if (time_16 == null || "".equals(time_16) || time_16.length() != 16) {
        time_13 = "";
    } else {
        String[] r = time_16.replace('-', '#').replace(':', '#').split("#");
        for (int i = 0; i < r.length; i++) {
            time_13 += r[i];
        }
    }
    return time_13;
}

/**
 * @author WangXiao
 * @param 13位的时间 yyyyMMdd HHmm
 * @return 16位的时间 yyyy-MM-dd HH:mm
 */
public static String time13To16(String time_13) {
    String time_16 = "";
    if (time_13 == null || "".equals(time_13) || time_13.length() != 13) {
        time_16 = "";
    } else {
        String y = time_13.substring(0, 4);
        String m = time_13.substring(4, 6);
        String d = time_13.substring(6, 8);
        String h = time_13.substring(9, 11);
        String mi = time_13.substring(11, 13);
        time_16 = y + "-" + m + "-" + d + " " + h + ":" + mi;
    }
    return time_16;
}

/**
 * @author WangXiao
 * @param 10位的日期 yyyy-MM-dd
 * @return 8位的日期 yyyyMMdd
 */
public static String date10To8(String date_10) {
    String date_8 = "";
    if (date_10 == null || "".equals(date_10) || date_10.length() != 10) {
        date_8 = "";
    } else {
        String[] r = date_10.split("-");
        for (int i = 0; i < r.length; i++) {
            date_8 += r[i];
        }
    }
    return date_8;
}

/**
 * @author WangXiao
 * @param 8位的日期 yyyyMMdd
 * @return 10位的日期 yyyy-MM-dd
 */
public static String date8To10(String date_8) {
    String date_10 = "";
    if (date_8 == null || "".equals(date_8) || date_8.length() != 8) {
        date_10 = "";
    } else {
        String y = date_8.substring(0, 4);
        String m = date_8.substring(4, 6);
        String d = date_8.substring(6, 8);
        date_10 = y + "-" + m + "-" + d;
    }
    return date_10;
}

/**
 * @author WangXiao
 * @param 7位的日期 yyyy-MM
 * @return 6位的日期 yyyyMM
 */
public static String date7To6(String date_7) {
    String date_6 = "";
    if (date_7 == null || "".equals(date_7) || date_7.length() != 7) {
        date_6 = "";
    } else {
        String[] r = date_7.split("-");
        for (int i = 0; i < r.length; i++) {
            date_6 += r[i];
        }
    }
    return date_6;
}

/**
 * @author WangXiao
 * @param 6位的日期 yyyyMM
 * @return 7位的日期 yyyy-MM
 */
public static String date6To7(String date_6) {
    String date_7 = "";
    if (date_6 == null || "".equals(date_6) || date_6.length() != 6) {
        date_7 = "";
    } else {
        String y = date_6.substring(0, 4);
        String m = date_6.substring(4, 6);
        date_7 = y + "-" + m;
    }
    return date_7;
}

public static Date getMonthDay(int year, int month) {
    if (month >= 10)
        return formatStr2Date(year + "-" + month + "-01", DateUtils.C_DATE_PATTON_DEFAULT);
    else
        return formatStr2Date(year + "-0" + month + "-01", DateUtils.C_DATE_PATTON_DEFAULT);
}

/**
 * 将时间转为目标时区时间
 * 
 * @param curr
 * @param fromZone
 * @return
 */
public static Date getTargetTimeZoneDate(Date curr, String toZone) {
    TimeZone time = TimeZone.getTimeZone(toZone);
    TimeZone currTime = TimeZone.getDefault();
    return getTargetTimeZoneDate(curr, currTime, time);
}

public static Date getTargetTimeZoneDate(Date date, TimeZone fromZone, TimeZone toZone) {
    int deltHour = (toZone.getRawOffset() - fromZone.getRawOffset()) / 3600000;
    Date targetDate = DateUtils.hoursBefore2Date(date, deltHour);
    return targetDate;
}

public static Date convertToDate(XMLGregorianCalendar cal) throws Exception {
    GregorianCalendar ca = cal.toGregorianCalendar();
    return ca.getTime();
}

public static Date getTargetTimeZoneDateSummer(Date date, TimeZone fromZone, TimeZone toZone) {
    int deltHour = (toZone.getRawOffset() - fromZone.getRawOffset()) / 3600000;
    if (deltHour > 0) {
        deltHour = deltHour - 1;
    } else {
        deltHour = deltHour + 1;
    }
    Date targetDate = DateUtils.hoursBefore2Date(date, deltHour);
    return targetDate;
}

/**
 * @author wangsf 获得当前日期所在周的最后一天.判断是否跨年
 * 
 * @return
 */
public static Date getWeekEndDay(final Date fromDate, final Date toDate) {
    Date reDate = null;
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(toDate);
    int tempWeek = calendar.get(Calendar.DAY_OF_WEEK);
    if (tempWeek == 1) {
        reDate = toDate;
    } else {
        tempWeek = 7 - (tempWeek - 1);
        reDate = DateUtils.defineDayBefore2Object(toDate, tempWeek, DateUtils.C_DATE_PATTON_DEFAULT, new Date());
    }
    // 判断跨年
    if (fromDate.getYear() < toDate.getYear()) {
        reDate = DateUtils.getYearEndDay(fromDate);
    }
    return reDate;
}

/**
 * 根据当前时间判断是星期几
 */
public static int dayForWeek(Date date) throws Exception {
    if (date == null)
        return 0;
    else {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        int dayForWeek = 0;
        if (c.get(Calendar.DAY_OF_WEEK) == 1) {
            dayForWeek = 7;
        } else {
            dayForWeek = c.get(Calendar.DAY_OF_WEEK) - 1;
        }
        return dayForWeek;
    }
}

/**
 * 比较两个日期之间的大小
 * 
 * @param d1
 * @param d2
 * @return 前者大于后者返回true 反之false
 */
public static boolean compareDate(Date d1, Date d2) {
    Calendar c1 = Calendar.getInstance();
    Calendar c2 = Calendar.getInstance();
    c1.setTime(d1);
    c2.setTime(d2);

    int result = c1.compareTo(c2);
    if (result >= 0) {
        return true;
    } else {
        return false;
    }
}

public static String addDay(Date paramDate, int n) {
    try {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar cd = Calendar.getInstance();
        cd.setTime(paramDate);
        // cd.add(Calendar.DATE, n);//增加一天
        cd.add(Calendar.MONTH, n);// 增加一个月

        return sdf.format(cd.getTime());

    } catch (Exception e) {
        return null;
    }
}

/**
 * 从orerservice.java移过来的,Created by fangquan
 * @param date
 * @return
 */
public static String getUsaDate(String date) {
    Calendar Cal = Calendar.getInstance();
    Date d1 = DateUtils.formatStr2Date(date, "yyyy-MM-dd");
    Cal.setTime(d1);
    Cal.add(Calendar.HOUR_OF_DAY, -24);
    Date d2 = DateUtils.calendar2Date(Cal);
    return DateUtils.formatDate2Str(d2);
}

/**
 * 
 * 获取ISO861 format 时间格式<br>
 * 
 * @return
 * @see
 * @since
 */
public static String formatTimeStamp() {
    String timeStamp = formatDate2Str(new Date());
    timeStamp = timeStamp.replaceAll(" ", "T");
    timeStamp += "-08:00";
    return timeStamp;
}

/**
 * 
 * 〈日期格式化〉<br>
 * 〈将格林威治时间格式为指定日期格式数据〉
 * 
 * @param dateStr
 * @return
 * @see
 * @since
 * @author zhangyong
 */
public static String formateGLWZDate(String dateStr, String format) {
    String returnDateMsg = null;
    SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.US);
    try {
        Date date = sdf.parse(dateStr);
        if (StringUtils.isBlank(format)) {
            format = DateUtils.C_TIME_PATTON_DEFAULT;
        }
        sdf = new SimpleDateFormat(format);
        returnDateMsg = sdf.format(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return returnDateMsg;
}

/**
 * 
 * @param date
 * @param amount
 * @return mengfanxin 2016/6/2
 */
public static Date addYears(Date date, int amount) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.add(Calendar.YEAR, amount);
    return calendar.getTime();
}

/**
 * 相对于指定日期的前几年(years < 000000)或者后几年(years > 0)时间
 * 
 */
@SuppressWarnings("unchecked")
public static <T extends Object> T defineYearBefore2Object(Date date, int years, String format, T instance) {
    if (years == 0) {
        return null;
    }

    if (format == null || format.equals("")) {
        format = C_TIME_PATTON_DEFAULT;
    }

    Calendar calendar = date2Calendar(date);
    calendar.add(Calendar.YEAR, years);

    if (instance instanceof Date) {
        return (T) calendar.getTime();
    } else if (instance instanceof String) {
        return (T) formatDate2Str(calendar2Date(calendar), format);
    }

    return null;
}

/**
 * 相对于指定日期的前几年(years < 000000)或者后几年(years > 0)时间
 * 
 */
public static Date defineYearBefore2Date(Date date, int years) {
    Date dateInstance = new Date();
    return defineYearBefore2Object(date, years, null, dateInstance);
}

/**
 * 相对于指定日期的前几年(years < 000000)或者后几年(years > 0)时间
 * 
 */
public static String defineYearBefore2Str(Date date, int years) {
    String stringInstance = formatDate2Str();
    return defineMonthBefore2Object(date, years, null, stringInstance);
}

}