import java.text.DecimalFormat;
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.Random;
import java.util.StringTokenizer;
import java.util.Vector;
public class DateUtil
{
    public static final String DEFAULT_DATE_FORMAT = "MM-dd-yyyy";
    public static final String ZH_DATE_FORMAT = "yyyy-MM-dd";
    public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
    public static final String DEFAULT_DATETIME_FORMAT = "MM-dd-yyyy HH:mm:ss";
    public static final String ZH_DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    public static final String DEFAULT_PRECISION_DATETIME_FORMAT = "MM-dd-yyyy HH:mm:ss:SSS";
    public static final String ZH_PRECISION_DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss:SSS";
    public static final String DEFAULT_PRECISION_MILLTIME_FORMAT = "yyyy:MM:dd HH:mm:ss:SSS";
    public static final String DEFAULT_HOUR_DATE_FORMAT = "MM-dd-yyyy HH";
    public static final String ZH_HOUR_DATE_FORMAT = "yyyy-MM-dd HH";
    public static final String DEFAULT_MINUTE_DATE_FORMAT = "MM-dd-yyyy HH:mm";
    public static final String ZH_MINUTE_DATE_FORMAT = "yyyy-MM-dd HH:mm";
    public static final String ZH_SECOND_DATE_FORMAT = "yyyyMMddHHmmss";
    /**
     * 日期时间格式1-"yyyy.MM.dd HH:mm:ss"
     */
    public static final String TIMEFORMAT_FULL = "yyyy.MM.dd HH:mm:ss";
    /**
     * 日期时间格式2-"yyyy.MM.dd HH:mm"
     */
    public static final String TIMEFORMAT_NO_SEC = "yyyy.MM.dd HH:mm";
    /**
     * 日期格式1-"yyyy.MM.dd"
     */
    public static final String TIMEFORMAT_NO_TIME = "yyyy.MM.dd";
    /**
     * 日期格式2-"yyyy.MM"
     */
    public static final String TIMEFORMAT_YEAR_MONTH_ONLY = "yyyy.MM";
    /**
     * 日期格式3-"yyyyMMdd"
     */
    public static final String TIMEFORMAT_ANOTHER_DATE = "yyyyMMdd";
    /**
     * 1024以内的素数表,172个
     */
    public static int sNumprime[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73,
            79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191,
            193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311,
            313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439,
            443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577,
            587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709,
            719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857,
            859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009,
            1013, 1019, 1021 };
    /**
     * 构造函数
     */
    public DateUtil()
    {
    }
    /**
     * 按日期时间格式1返回当前时间 yyyy.MM.dd HH:mm:ss
     * 
     * @return String 获得当前时间
     */
    public static String getCurrentDateTime()
    {
        SimpleDateFormat sdf = new SimpleDateFormat(TIMEFORMAT_FULL);
        return sdf.format(new Date());
    }
    
    public static String getCurrentDateTime_14()
    {
        SimpleDateFormat sdf = new SimpleDateFormat(ZH_SECOND_DATE_FORMAT);
        return sdf.format(new Date());
    }
    /**
     * 按日期格式1返回当前日期
     * 
     * @return String 获得当前日期
     */
    public static String getCurrentDate()
    {
        SimpleDateFormat sdf = new SimpleDateFormat(TIMEFORMAT_NO_TIME, Locale.US);
        return sdf.format(new Date());
    }
    /**
     * 按日期格式3返回数字日期
     * 
     * @return String 获得数字日期
     */
    public static String getPiciDate()
    {
        SimpleDateFormat sdf = new SimpleDateFormat(TIMEFORMAT_ANOTHER_DATE, Locale.US);
        return sdf.format(new Date());
    }
    /**
     * 按日期格式3返回数字日期
     * 
     * @param sNowDateTime 设置时间,格式为YYYYMMDDHH24MISS
     */
    public static void setCurrentDate(String sNowDateTime)
    {
        if (sNowDateTime.length() == 14)
        {
            int iyear;
            int imonth;
            int idate;
            int ihour;
            int iminute;
            int isecond;
            iyear = java.lang.Integer.parseInt(sNowDateTime.substring(0, 4));
            if (iyear < 2000)
            {
                iyear = 2003;
            }
            imonth = java.lang.Integer.parseInt(sNowDateTime.substring(4, 6));
            if (imonth > 12)
            {
                imonth = 11;
            }
            idate = java.lang.Integer.parseInt(sNowDateTime.substring(6, 8));
            if (idate > 31)
            {
                idate = 11;
            }
            ihour = java.lang.Integer.parseInt(sNowDateTime.substring(8, 10));
            if (ihour > 23)
            {
                ihour = 11;
            }
            iminute = java.lang.Integer.parseInt(sNowDateTime.substring(10, 12));
            if (iminute > 59)
            {
                iminute = 11;
            }
            isecond = java.lang.Integer.parseInt(sNowDateTime.substring(12, 14));
            if (isecond > 59)
            {
                isecond = 11;
            }
            Calendar serverNow = Calendar.getInstance();
            serverNow.set(iyear, imonth, idate, ihour, iminute, isecond);
        }
    }
    /**
     * Function name: sGetAddTimes Description: 给一个时间增加上一定的时间
     * 
     * @param timePoint 计时时间点(格式:TimeFormat1)
     * @param addSeconds times to add(单位:秒)
     * @return String 返回增加时间后的时间(格式:TimeFormat1)
     */
    public static String sGetAddTimes(String timePoint, long addSeconds)
    {
        if (timePoint.length() == 19)
        {
            String dRet = "";
            SimpleDateFormat sdf = new SimpleDateFormat(TIMEFORMAT_FULL);
            Date timePoints = sdf.parse(timePoint, new java.text.ParsePosition(0));
            Date dateTimes = new Date((timePoints.getTime() / 1000L + (addSeconds)) * 1000L);
            dRet = sdf.format(dateTimes);
            return dRet;
        }
        else
        {
            return "";
        }
    }
    /**
     * Function name: sGetAddTimes Description: 给一个时间减去上一定的时间
     * 
     * @param timePoint 计时时间点(格式:TimeFormat1)
     * @param addSeconds times to add(单位:秒)
     * @return String 返回减去时间后的时间(格式:TimeFormat1)
     */
    public static String sGetMinusTimes(String timePoint, long minusSeconds)
    {
        if (timePoint.length() == 19)
        {
            String dRet = "";
            SimpleDateFormat sdf = new SimpleDateFormat(TIMEFORMAT_FULL);
            Date timePoints = sdf.parse(timePoint, new java.text.ParsePosition(0));
            Date dateTimes = new Date((timePoints.getTime() / 1000L - (minusSeconds)) * 1000L);
            dRet = sdf.format(dateTimes);
            return dRet;
        }
        else
        {
            return "";
        }
    }
    /**
     * Function name: lTimeCompare Description: 两时间比较. Compare two times
     * 
     * @param compTime1 比较时间1(格式:TimeFormat1)
     * @param compTime2 比较时间2(格式:TimeFormat1)
     * @return long 返回相差的时间(单位:秒)
     */
    public static long lTimeCompare(String compTime1, String compTime2)
    {
        if ((compTime1.length() == 19) && (compTime2.length() == 19))
        {
            long iReturn = -1;
            SimpleDateFormat sdf = new SimpleDateFormat(TIMEFORMAT_FULL);
            Date dateTime1 = sdf.parse(compTime1, new java.text.ParsePosition(0));
            Date dateTime2 = sdf.parse(compTime2, new java.text.ParsePosition(0));
            iReturn = dateTime2.getTime() / 1000L - dateTime1.getTime() / 1000L;
            return iReturn;
        }
        else
        {
            return 0;
        }
    }
    /**
     * Function name: lTimeCompareNow Description: 与当前时间比较. Compare one time
     * with now
     * 
     * @param compTime1 比较时间1(格式:TimeFormat1)
     * @return long 返回相差的时间(单位:秒)
     */
    public static long lTimeCompareNow(String compTime1)
    {
        if (compTime1 != null && compTime1.equals("999"))
        {
            return -1;
        }
        if (compTime1.length() == 19 || compTime1.length() == 10)
        {
            long iReturn = -1;
            if (compTime1.length() == 10)
            {
                compTime1 += " 00:00:00";
            }
            SimpleDateFormat sdf = new SimpleDateFormat(TIMEFORMAT_FULL);
            Date dateTime1 = sdf.parse(compTime1, new java.text.ParsePosition(0));
            iReturn = java.lang.System.currentTimeMillis() / 1000L - dateTime1.getTime() / 1000L;
            return iReturn;
        }
        else
        {
            return 0;
        }
    }
    /**
     * Function name: fmtDate Description: 日期字符串规范化. format a date string using
     * comm
     * 
     * @param sDate 要规范的日期字符串(如2003-11-11、2003/11/11)
     * @param comm 日期字符串中间的分隔符
     * @return String 返回规范化后的字符串
     */
    public static String fmtDate(String sDate, String comm)
    {
        String dRet = "";
        if (sDate.length() == 10)
        {
        }
        else
        {
            sDate = getCurrentDate();
        }
        dRet = sDate.substring(0, 4) + comm + sDate.substring(5, 7) + comm + sDate.substring(8, 10);
        return dRet;
    }
    /**
     * Function name: fmtDateTime Description: 日期时间字符串规范化. format a date string
     * using comm
     * 
     * @param sDate 要规范的日期时间字符串(如2003-11-11 11:11:11、2003/11/11 11:11:11)
     * @param comm 日期中间的分隔符
     * @return String 返回规范化后的字符串
     */
    public static String fmtDateTime(String sDate, String comm)
    {
        String dRet = "";
        if (sDate.length() == 19)
        {
        }
        else
        {
            sDate = getCurrentDateTime();
        }
        dRet = sDate.substring(0, 4) + comm + sDate.substring(5, 7) + comm + sDate.substring(8, 10) + " "
                + sDate.substring(11, 13) + ":" + sDate.substring(14, 16) + ":" + sDate.substring(17, 19);
        return dRet;
    }
    /**
     * Function Name: SubStr Description: 取指定长度的字符子串,超过取到串尾
     * 
     * @param fullString 源字符串
     * @param nStart 开始字节
     * @param nLen 要取的长度
     * @return String 返回目的字符串
     */
    public static String subStr(String fullString, int nStart, int nLen)
    {
        String sResult = "";
        if ((nStart + nLen) > fullString.length())
        {
            sResult = fullString.substring(nStart);
        }
        else
        {
            sResult = fullString.substring(nStart, (nStart + nLen));
        }
        return sResult;
    }
    /**
     * Function Name: DevideStr Description: 分解字符串
     * 
     * @param fullString 源字符串
     * @param sComm 字符串中间的分隔符
     * @return Vector 返回分解后的字符串列
     */
    public static Vector devideStr(String fullString, String sComm)
    {
        Vector vTmp = new Vector();
        try
        {
            if (sComm.length() > 1)
            {
                sComm = sComm.substring(0, 1);
            }
            StringTokenizer stString = new StringTokenizer(fullString, sComm);
            while (stString.hasMoreTokens())
            {
                vTmp.addElement(stString.nextToken());
            }
        }
        catch (Exception e)
        {
            vTmp.clear();
        }
        return vTmp;
    }
    /**
     * Function Name: DivideCSV Description: 分解CSV格式字符串
     * 
     * @param fullString 源字符串
     * @param sComm 字符串中间的分隔符
     * @return Vector 返回分解后的字符串列
     * @see #devideStr(String, String) deprecated 由DevideStr(String,
     *      String)函数替代,该函数不再使用。
     */
    public static Vector divideCSV(String fullString, String sComm)
    {
        Vector vTmp = new Vector();
        if (sComm.length() > 1)
        {
            sComm = sComm.substring(0, 1);
        }
        StringTokenizer stString = new StringTokenizer(fullString, sComm);
        while (stString.hasMoreTokens())
        {
            vTmp.addElement(stString.nextToken());
        }
        return vTmp;
    }
    /**
     * Function Name: GenRandom Description: 随机数产生程序
     * 
     * @param nIn 随机数种子
     * @param nLen 随机数长度
     * @return String 返回随机数
     */
    public static String genRandom(int nIn, int nLen)
    {
        int nYear;
        int nMonth;
        int nDay;
        int nHour;
        int nSec;
        int nMsec;
        double f1;
        double f2;
        long temp;
        int count;
        int loopCount;
        int i;
        int rest;
        String sResult = "";
        String sFull = "";
        if (nLen > 9)
        {
            loopCount = nLen / 9;
            for (i = 1; i <= loopCount; i++)
            {
                sResult = sResult + genRandom(i, 9);
            }
            rest = nLen - loopCount * 9;
            if (rest != 0)
            {
                sResult = sResult + genRandom(1, rest);
            }
        }
        else
        {
            if (nLen == 0)
            {
                return "";
            }
            sFull = "";
            for (count = 1; count <= nLen; count++)
            {
                sFull = sFull + "0";
            }
            DecimalFormat nf = new DecimalFormat(sFull);
            Calendar nowTime = Calendar.getInstance();
            nYear = nowTime.get(Calendar.YEAR);
            nMonth = nowTime.get(Calendar.MONTH) + 1;
            nDay = nowTime.get(Calendar.DAY_OF_MONTH);
            nHour = nowTime.get(Calendar.HOUR_OF_DAY);
            nSec = nowTime.get(Calendar.SECOND);
            nMsec = nowTime.get(Calendar.MILLISECOND);
            f2 = Math.sin(Math.sqrt((nIn % 713) + nMsec + nSec * 34 + nHour * 47) + nMsec * nSec * nHour);
            f1 = Math.pow((Math.abs(f2 * 89 + 79 * Math.cos(nIn + nMsec * nSec)) * 31), 2);
            temp = (long) f1 + nIn + nYear + nMonth * 11 + nDay;
            StringBuffer stemp = new StringBuffer((new java.lang.Long(temp)).toString());
            stemp = stemp.reverse();
            Random rd = new Random();
            rd.setSeed(java.lang.Long.parseLong(stemp.toString()) + (nIn % 3));
            sResult = nf.format(rd.nextInt((int) (Math.pow(10, nLen) - 1)));
        }
        return sResult;
    }
    /**
     * Function Name: VarlenRnd Description: 取可变长随机数,长度范围由参数指定
     * 
     * @param minLen 最小长度
     * @param maxLen 最大长度
     * @return String 返回随机数
     */
    public static String varlenRnd(int minLen, int maxLen)
    {
        String sResult = "";
        if (minLen < maxLen)
        {
            int nLen = java.lang.Integer.parseInt(genRandom(3, 1)) % (maxLen - minLen + 1) + minLen;
            sResult = genRandom(3, nLen);
        }
        else
        {
            sResult = genRandom(3, maxLen);
        }
        return sResult;
    }
    /**
     * BCD码左对齐转字符串
     * 
     * @param bcd 你一次读进的字节数,因为可能会大于你要处理的字节数
     * @param begin 字节开始位置
     * @param length 字节长,与begin一起决定真正要处理的字节数
     * @return String 返回对齐后字符串
     */
    public static String bcd2Str(byte[] bcd, int begin, int length)
    {
        String str = "";
        int temp;
        for (int i = begin; i < begin + length; i++)
        {
            if (bcd[i] == 0)
            {
                break;
            }
            temp = (bcd[i] & 0x0F) % 10;
            str += temp;
            temp = (bcd[i] >>> 4) % 10;
            if (bcd[i] >>> 4 != 0)
            {
                str += temp;
            }
        }
        return str;
    }
    /**
     * 普通的二进制转字串
     * 
     * @param hex 你一次读进的字节数,因为可能会大于你要处理的字节数
     * @param begin 字节开始位置
     * @param num 字节长,与begin一起决定真正要处理的字节数
     * @return String 返回转换后字符串
     */
    public static String hex2Str(byte[] hex, int begin, int num)
    {
        String overflow = "overflow";
        long ll = 0;
        if (num > 8)
        {
            return overflow;
        }
        for (int i = begin; i < begin + num; i++)
        {
            ll = ll * 256 + hex[i];
        }
        return String.valueOf(ll);
    }
    /**
     * 获取日期的年份
     * 
     * @param d 日期
     * @return 年份
     */
    public static int getYear(Date d)
    {
        GregorianCalendar cal = new GregorianCalendar();
        if (d != null)
        {
            cal.setTime(d);
            return cal.get(Calendar.YEAR);
        }
        else
        {
            return 1900;
        }
    }
    /**
     * 获取日期的月份
     * 
     * @param d 日期
     * @return 月份
     */
    public static int getMonth(Date d)
    {
        GregorianCalendar cal = new GregorianCalendar();
        if (d != null)
        {
            cal.setTime(d);
            return cal.get(Calendar.MONTH) + 1;
        }
        else
        {
            return 1;
        }
    }
    /**
     * 获取日期的天
     * 
     * @param d 日期
     * @return 天
     */
    public static int getDay(Date d)
    {
        GregorianCalendar cal = new GregorianCalendar();
        if (d != null)
        {
            cal.setTime(d);
            return cal.get(Calendar.DAY_OF_MONTH);
        }
        else
        {
            return 1;
        }
    }
    /**
     * 获取日期的小时
     * 
     * @param d 日期
     * @return 小时
     */
    public static int getHour(Date d)
    {
        GregorianCalendar cal = new GregorianCalendar();
        if (d != null)
        {
            cal.setTime(d);
            return cal.get(Calendar.HOUR_OF_DAY);
        }
        else
        {
            return 0;
        }
    }
    /**
     * 获取日期的分
     * 
     * @param d 日期
     * @return 分
     */
    public static int getMinute(Date d)
    {
        GregorianCalendar cal = new GregorianCalendar();
        if (d != null)
        {
            cal.setTime(d);
            return cal.get(Calendar.MINUTE);
        }
        else
        {
            return 0;
        }
    }
    /**
     * 获取日期的秒
     * 
     * @param d 日期
     * @return 秒
     */
    public static int getSecond(Date d)
    {
        GregorianCalendar cal = new GregorianCalendar();
        if (d != null)
        {
            cal.setTime(d);
            return cal.get(Calendar.SECOND);
        }
        else
        {
            return 0;
        }
    }
    /**
     * 获取日期的毫秒
     * 
     * @param d 日期
     * @return 毫秒
     */
    public static int getMilliSecond(Date d)
    {
        GregorianCalendar cal = new GregorianCalendar();
        if (d != null)
        {
            cal.setTime(d);
            return cal.get(Calendar.MILLISECOND);
        }
        else
        {
            return 0;
        }
    }
    /**
     * 转换日期为MM-dd-yyyy HH:mm:ss格式的字符串
     * 
     * @param d 日期
     * @return 字符串
     */
    public static String toString(Date d)
    {
        if (d == null)
        {
            return null;
        }
        return toString(d, DEFAULT_DATETIME_FORMAT);
    }
    /**
     * 转换日期为指定格式的字符串
     * 
     * @param date 日期
     * @param format 指定格式
     * @return 字符串
     */
    public static String toString(Date date, String format)
    {
        if (date == null)
        {
            return "";
        }
        if ((format == null) || (format.length() == 0))
        {
            return "";
        }
        SimpleDateFormat formatter = new SimpleDateFormat(format);
        return formatter.format(date);
    }
    /**
     * 转换日期为指定区域内指定格式的字符串
     * 
     * @param date 日期
     * @param format 指定格式
     * @param locale 指定区域
     * @return 字符串
     */
    public static String toString(Date date, String format, Locale locale)
    {
        if (date == null)
        {
            return "";
        }
        if ((format == null) || (format.length() == 0))
        {
            return "";
        }
        if (locale == null)
        {
            return "";
        }
        SimpleDateFormat formatter = new SimpleDateFormat(format, locale);
        return formatter.format(date);
    }
    /**
     * 转换字符串为日期
     * 
     * @param s 字符串
     * @return 日期
     */
    public static Date toDate(String s)
    {
        if ((s == null) || (s.length() == 0))
        {
            return null;
        }
        return toDate(s, DEFAULT_DATETIME_FORMAT);
    }
    /**
     * 转换字符串为指定格式的日期
     * 
     * @param s 字符串
     * @param format 指定格式
     * @return 日期
     */
    public static Date toDate(String s, String format)
    {
        if ((s == null) || (s.length() == 0))
        {
            return null;
        }
        if ((format == null) || (format.length() == 0))
        {
            return null;
        }
        SimpleDateFormat formatter = new SimpleDateFormat(format);
        ParsePosition pos = new ParsePosition(0);
        Date d = formatter.parse(s, pos);
        return d;
    }
    /**
     * 转换字符串为指定区域内指定格式的日期
     * 
     * @param s 字符串
     * @param format 指定格式
     * @param locale 指定区域
     * @return 日期
     */
    public static Date toDate(String s, String format, Locale locale)
    {
        Locale loc;
        if ((s == null) || (s.length() == 0))
        {
            return null;
        }
        if ((format == null) || (format.length() == 0))
        {
            return null;
        }
        if (locale == null)
        {
            loc = Locale.getDefault();
        }
        else
        {
            loc = locale;
        }
        SimpleDateFormat formatter = new SimpleDateFormat(format, loc);
        ParsePosition pos = new ParsePosition(0);
        Date d = formatter.parse(s, pos);
        return d;
    }
    /**
     * 判断字符串是否为日期
     * @param s 字符串
     * @return 是否为日期
     */
    public static boolean isDate(String s)
    {
        Date date = toDate(s);
        if (date == null)
        {
            return false;
        }
        String str = toString(date);
        return str.equalsIgnoreCase(s);
    }
    /**
     * 判断字符串是否为指定格式日期
     * @param s 字符串
     * @param format 指定格式
     * @return 是否为日期
     */
    public static boolean isDate(String s, String format)
    {
        Date date = toDate(s, format);
        if (date == null)
        {
            return false;
        }
        String str = toString(date, format);
        return str.equalsIgnoreCase(s);
    }
    /**
     * 判断字符串是否为指定区域内指定格式日期
     * @param s 字符串
     * @param format 指定格式
     * @param locale 指定区域
     * @return 是否为日期
     */
    public static boolean isDate(String s, String format, Locale locale)
    {
        Date date = toDate(s, format, locale);
        if (date == null)
        {
            return false;
        }
        String str = toString(date, format, locale);
        return str.equalsIgnoreCase(s);
    }
    /**
     * 比较两日期是否相等
     * @param d0 日期0
     * @param d1 日期1
     * @return 是否相等
     */
    public static boolean compare(Date d0, Date d1)
    {
        if (d0 == null && d1 == null)
        {
            return true;
        }
        if (d0 == null || d1 == null)
        {
            return false;
        }
        else
        {
            return d0.getTime() == d1.getTime();
        }
    }
    /**
     * 将日期转换为YYYYMMDDHHMISS类型的方法
     * 
     * @param d Date
     * @return String
     */
    public static String toDate(Date d)
    {
        return toString(d, ZH_SECOND_DATE_FORMAT);
    }
    /**
     * 将日期类型转换为微秒级别的字符串,格式为yyyy:MM:dd HH:mm:ss:SSS
     * 
     * @param d Date
     * @return String
     */
    public static String toDateOfMilliSecond(Date d)
    {
        return toString(d, DEFAULT_PRECISION_MILLTIME_FORMAT);
    }
    /**
     * 返回某日期增减指定月数后的新值
     * 
     * @param oldDate 旧日期,格式:yyyyMMddHHmmss
     * @param valve 增减月数
     * @return 新日期,格式:yyyyMMddHHmmss
     */
    public static String getDateByAddMonth(String oldDate, int valve)
    {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(toDate(oldDate, ZH_SECOND_DATE_FORMAT));
        calendar.add(Calendar.MONTH, valve);
        return DateUtil.toDate(calendar.getTime());
    }
    /**
     * 计算增加年份后新的日期的值
     * 
     * @param oldDate 之前的日期,精确到秒级,字符串类型,如20060901235959
     * @param valve 阀值
     * @return 新日期
     */
    public static String getDateByAddYear(String oldDate, int valve)
    {
        int year = Integer.parseInt(oldDate.substring(0, 4));
        String newDate = null;
        newDate = String.valueOf(year + valve) + oldDate.substring(4, oldDate.length());
        return newDate;
    }
    /**
     * 计算增加日期后新的日期的值。
     * 
     * @param oldDate 之前的日期,精确到秒级,字符串类型,如20060901235959
     * @param valve 阀值
     * @return 新日期
     */
    public static String getDateByAddDay(String oldDate, int valve)
    {
        Date a = toDate(oldDate, ZH_SECOND_DATE_FORMAT);
        long b = a.getTime();
        long c = b + valve * 24 * 60 * 60 * 1000;
        Date d = new Date(c);
        return toDate(d);
    }
    /**
     * 计算增加小时后新的日期的值。
     * 
     * @param oldDate 之前的日期,精确到秒级,字符串类型,如20060901235959
     * @param valve 阀值
     * @return 新日期
     */
    public static String getDateByAddHour(String oldDate, int valve)
    {
        Date a = toDate(oldDate, ZH_SECOND_DATE_FORMAT);
        long b = a.getTime();
        long c = b + valve * 60 * 60 * 1000;
        Date d = new Date(c);
        return toDate(d);
    }
    /**
     * 计算增加分钟后新的日期的值。
     * 
     * @param oldDate 之前的日期,精确到秒级,字符串类型,如20060901235959
     * @param valve 阀值
     * @return 新日期
     */
    public static String getDateByAddMinute(String oldDate, int valve)
    {
        Date a = toDate(oldDate, ZH_SECOND_DATE_FORMAT);
        long b = a.getTime();
        long c = b + valve * 60 * 1000;
        Date d = new Date(c);
        return toDate(d);
    }
    /**
     * 计算增加秒钟后新的日期的值。
     * 
     * @param oldDate 之前的日期,精确到秒级,字符串类型,如20060901235959
     * @param valve 阀值
     * @return 新日期
     */
    public static String getDateByAddSecond(String oldDate, int valve)
    {
        Date a = toDate(oldDate, ZH_SECOND_DATE_FORMAT);
        long b = a.getTime();
        long c = b + valve * 1000;
        Date d = new Date(c);
        return toDate(d);
    }
    /**
     * 取得当前时间 falg=0 格式为:yyyy.MM.dd HH:mm:ss falg=1 格式为:mm
     * 
     * @param flag 标志
     * @return 当前时间
     */
    public static String getTime(int flag)
    {
        java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
        String operTime = formatter.format(new java.util.Date());
        String sMoth = operTime.substring(5, 7);
        if (flag == 0)
        {
            return operTime;
        }
        else
        {
            return sMoth;
        }
    }
    /**
     * 判断是否是闰年
     * @param year 年份
     * @return 是否是闰年
     */
    public static boolean isLeapYear(int year)
    {
        if (year < 0)
        {
            return false;
        }
        if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    /**
     * 把传进来的 日期+时间 格式填充。把时间的 时、分、秒的数字填充为2位。不足2位的前面补0
     * 
     * @param datetime 日期
     * @return 补充后的日期
     */
    public static String fillDateTime(String datetime)
    {
        if (datetime == null || datetime.trim().length() == 0)
        {
            return "";
        }
        String[] ary = datetime.split(" ");
        if (ary == null || ary.length != 2)
        { //这里对日期时间不做合法性检查。设定该日期时间都是合法的。
          //简单的检查下,如果格式不合法,直接返回空字符串
            return "";
        }
        //这里暂时对日期格式不做转换,只对时间格式做转换 
        String time = fillTime(ary[1]);
        if (time.trim().length() == 0)
        {//如果时间格式转换错误,则返回空字符串
            return "";
        }
        String date = fillDate(ary[0].replaceAll("\\.", "-"));
        if (date.trim().length() == 0)
        {
            return "";
        }
        return date + " " + time;
    }
    /**
     * 填充日期
     * @param date 日期
     * @return 日期
     */
    public static String fillDate(String date)
    {
        if (date == null || date.length() == 0)
        {
            return "";
        }//2009-9-9
        String[] ary = date.split("-");
        if (ary.length != 3 || ary[1] == null || ary[1].trim().length() == 0 || ary[2] == null
                || ary[2].trim().length() == 0 || (ary[1].trim().length() != 1 && ary[1].trim().length() != 2)
                || (ary[2].trim().length() != 1 && ary[2].trim().length() != 2))
        {
            return "";
        }
        if (ary[1].length() == 1)
        {
            ary[1] = "0" + ary[1];
        }
        if (ary[2].length() == 1)
        {
            ary[2] = "0" + ary[2];
        }
        return ary[0] + "-" + ary[1] + "-" + ary[2];
    }
    /**
     * 填充时间格式. 把时间的 时、分、秒的数字填充为2位。不足2位的前面补0 转换后的格式为: HH:mm:ss
     * 
     * @param time 日期
     * @return 日期
     */
    public static String fillTime(String time)
    {
        //这里对时间的合法性不做检查
        if (time == null)
        {
            return "";
        }
        time = time.trim();
        if (time.equals(""))
        {
            return "";
        }
        String[] timesplit = time.split(":", 3);
        if (timesplit.length != 3)
        {
            return "";
        }
        if (timesplit[0] == null || timesplit[1] == null || timesplit[2] == null)
        {
            return "";
        }
        String shour = timesplit[0].trim();
        String sminute = timesplit[1].trim();
        String ssecond = timesplit[2].trim();
        if (shour.equals("") || sminute.equals("") || ssecond.equals(""))
        {
            return "";
        }
        if (shour.length() == 1)
        {
            shour = "0" + shour;
        }
        if (sminute.length() == 1)
        {
            sminute = "0" + sminute;
        }
        if (ssecond.length() == 1)
        {
            ssecond = "0" + ssecond;
        }
        return shour + ":" + sminute + ":" + ssecond;
    }
    /**
     * 检测输入字符串是否是时间格式 HH:mm:dd
     * 
     * @param s 日期
     * @return 是否是时间格式
     */
    public static boolean checkTimeFormat(String s)
    {
        if (s == null)
        {
            return false;
        }
        s = s.trim();
        if (s.equals(""))
        {
            return false;
        }
        String[] timesplit = s.split(":", 3);
        if (timesplit.length != 3)
        {
            return false;
        }
        if (timesplit[0] == null || timesplit[1] == null || timesplit[2] == null)
        {
            return false;
        }
        String shour = timesplit[0].trim();
        String sminute = timesplit[1].trim();
        String ssecond = timesplit[2].trim();
        if (shour.equals("") || sminute.equals("") || ssecond.equals(""))
        {
            return false;
        }
        try
        {
            int ihour = Integer.parseInt(shour);
            if (shour.trim().length() != 2 && shour.trim().length() != 1)
            {
                return false;
            }
            if (ihour > 23 || ihour < 0)
            {
                return false;
            }
            if (sminute.trim().length() != 2 && sminute.trim().length() != 1)
            {
                return false;
            }
            int iminute = Integer.parseInt(sminute);
            if (iminute < 0 || iminute > 59)
            {
                return false;
            }
            if (ssecond.trim().length() != 2 && ssecond.trim().length() != 1)
            {
                return false;
            }
            int isecond = Integer.parseInt(ssecond);
            if (isecond < 0 || isecond > 59)
            {
                return false;
            }
        }
        catch (Exception e)
        {
            return false;
        }
        return true;
    }
    /**
     * 检测输入字符串是否是 日期+时间 格式,包括闰年检测
     * @param s 日期
     * @return 是否是日期+时间 格式
     */
    public boolean checkDateTimeFormat(String s)
    {
        if (s == null)
        {
            return false;
        }
        s = s.trim();
        if (s.equals(""))
        {
            return false;
        }
        String[] dtparts = s.split(" ", 2);
        if (dtparts.length != 2)
        {
            return false;
        }
        String dateparts = dtparts[0];
        String timeparts = dtparts[1];
        return checkDateFormat(dateparts) && checkTimeFormat(timeparts);
    }
    /**
     * 检测输入字符串是否是日期格式yyyy-MM-dd,包括闰年检测
     * @param s 日期
     * @return 是否是日期格式yyyy-MM-dd
     */
    public static boolean checkDateFormat(String s)
    {
        if (s == null)
        {
            return false;
        }
        s = s.trim();
        if (s.equals(""))
        {
            return false;
        }
        String[] dts = s.split("-");
        if (dts.length != 3)
        {
            return false;
        }
        if (dts[0].length() != 4)
        {
            return false;
        }
        if ((dts[1].length() != 1 && dts[1].length() != 2))
        {
            return false;
        }
        if (dts[2].length() != 1 && dts[2].length() != 2)
        {
            return false;
        }
        int year = 0;
        int month = 0;
        int day = 0;
        int days = 0;
        try
        {
            year = Integer.valueOf(dts[0]);
            if (year > 10000 || year < 1)
            {
                return false;
            }
        }
        catch (Exception e)
        {
            return false;
        }
        try
        {
            month = Integer.valueOf(dts[1]);
            if (month < 1 || month > 12)
            {
                return false;
            }
        }
        catch (Exception e)
        {
            return false;
        }
        try
        {
            day = Integer.valueOf(dts[2]);
            switch (month)
            {
                case 1:
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:
                case 12:
                    days = 31;
                    break;
                case 4:
                case 6:
                case 9:
                case 11:
                    days = 30;
                    break;
                case 2:
                    if (isLeapYear(year))
                    {
                        days = 29;
                    }
                    else
                    {
                        days = 28;
                    }
                default:
            }
            if (day > days || day < 1)
            {
                return false;
            }
        }
        catch (Exception e)
        {
            return false;
        }
        return true;
    }
    /**
     * 把字符串转换成 日期
     * @param strdate 字符串日期
     * @return 日期
     */
    public Date stringParsetoDate(String strdate)
    {
        if (strdate == null || strdate.trim().equals(""))
        {
            return null;
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try
        {
            return sdf.parse(strdate);
        }
        catch (Exception e)
        {
            return null;
        }
    }
    /**
     * 把字符串转换成 日期时间
     * @param str 字符串日期
     * @return 日期
     */
    public Date strToDateTime(String str)
    {
        if (str == null || str.trim().equals(""))
        {
            return null;
        }
        java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try
        {
            return sdf.parse(str);
        }
        catch (Exception e)
        {
            return null;
        }
    }
    /**
     * 从字符串中得到月份
     * @param datestr 字符串日期
     * @return 月份
     */
    public int getMonthfromStr(String datestr)
    {
        int month = 0;
        if (datestr == null || datestr.trim().equals(""))
        {
            return month;
        }
        String[] splitedate = datestr.split("-");
        try
        {
            month = Integer.parseInt(splitedate[1].trim());
            if (month < 1 || month > 12)
            {
                return 0;
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return 0;
        }
        return month;
    }
    /**
     * 把给定日期减去N个月,返回一个Date
     * @param date 给定日期
     * @param nMonth 月数
     * @return Date
     * @throws Exception 抛出的异常
     */
    public Date minusMonth(Calendar date, int nMonth) throws Exception
    {
        date.add(Calendar.MONTH, -nMonth);
        SimpleDateFormat spdf = new SimpleDateFormat("yyyy-MM-dd");
        return spdf.parse(spdf.format(date.getTime()));
    }
}