天天看點

轉換long類型日期資料并計算出時間段的百分比

需求:傳入三個日期,根據目前日期和兩個日期,判斷出目前時間占改時間段的百分比是多少

傳入某一開始日期  和某一結束日期,使用目前日期判斷目前日期在該時間段内的百分比

擴充類: DateUtils 工具類方法。用于轉換各種日期的資料,将傳入字元串的日期格式格式化成日期格式,(見最後)

BigDecimal大資料類, 用于處理long類型的時間資料

DecimalFormat 資料轉換類,本處使用者将數值型資料改為百分比

主函數:

package aaa;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.util.Date;

public class testNum {
public static void main(String[] args) {
	String dateStr1 = "2017-11-28";
	String dateStr2 = "2017-12-5";
	Date currentDate = new Date();
	Date date1 =null ;
	Date date2 =null ;
	try {
		date1 = DateUtils.parseDate(dateStr1);
		date2 = DateUtils.parseDate(dateStr2);
	} catch (ParseException e) {
		System.err.println("轉換日期錯誤");
	}
	if(currentDate.before(date1)){
		System.out.println("aaaa");
	}else{
		System.out.println("bbb");
	}
	//使用大資料格式處理日期格式
	BigDecimal b1 = new BigDecimal(date1.getTime());
	BigDecimal b2 = new BigDecimal(date2.getTime());
	BigDecimal bc = new BigDecimal(currentDate.getTime());
	DecimalFormat df = new DecimalFormat("0%");
	//設定最大小數位
//	df.setMaximumFractionDigits(1);
	//設定為四舍五入方式
//	df.setRoundingMode(RoundingMode.HALF_UP);
	//減法
	BigDecimal bMiuns = bc.subtract(b1);
	BigDecimal bMiunsAll = b2.subtract(b1);
	//除法
	BigDecimal bOk = bMiuns.divide(bMiunsAll, 2, RoundingMode.HALF_UP);
	String bOk1 =df.format(bOk); 
	System.out.println("目前時間和開始時間差:"+bc.subtract(b1));
	System.out.println("目前時間和開始時間差:"+b2.subtract(bc));
	System.out.println("總時間:"+b2.subtract(b1));
	System.out.println("百分比:"+bMiuns.divide(bMiunsAll, 2, RoundingMode.HALF_UP));
	System.out.println("轉換後:"+bOk1);
}
}            
/*
 * Copyright (c) 2011 公司日期工具類 All rights reserved.
 */
package aaa;

import java.io.IOException;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.Locale;
import java.util.TimeZone;

//import org.ocpsoft.prettytime.PrettyTime;

/***
 * 處理所有和日期相關的處理.
 */
public class DateUtils extends Object {
    /*** 系統總的失效日期. */
    public static final String DATE_FOREVER = "9999-12-31";
    /** 時間格式. */
    public static final String FORMAT_DATETIME = "yyyy-MM-dd HH:mm:ss";
    /** 時間格式. */
    public static final String FORMAT_DATE_CN = "yyyy年MM月dd日";
    /** 時間格式. */
    public static final String FORMAT_TIMESTAMP = "yyyy-MM-dd HH:mm:ss:SSS";
    /** 到小時分鐘的日期格式. */
    public static final String FORMAT_DATETIME_HM = "yyyy-MM-dd HH:mm";
    /** 全時間格式. */
    public static final String FORMAT_FULLTIME = "yyMMddHHmmssSSS";
    /** 日期格式. */
    public static final String FORMAT_DATE = "yyyy-MM-dd";
    /** 日期格式. */
    public static final String FORMAT_YEARMONTH = "yyyy-MM";
    /** 純時間格式. */
    public static final String FORMAT_TIME = "HH:mm:ss";

    /**
     * compare two kinds String with format : 12:00 , 08:00; or 12:00:00, 08:00:00.<br>
     * <br>
     * @param firstTime the first time string.
     * @param secondTime the second time string.
     * @return 0 -- same 1 -- first bigger than second -1 -- first smaller than second -2 -- invalid time format
     */
    public static int compareOnlyByTime(String firstTime, String secondTime) {
        try {
            String timeDelm = ":";

            // calculate the first time to integer
            int pos = firstTime.indexOf(timeDelm);
            int iFirst = Integer.parseInt(firstTime.substring(0, pos)) * 10000;
            firstTime = firstTime.substring(pos + 1);
            pos = firstTime.indexOf(timeDelm);

            if (pos > 0) {
                iFirst = iFirst + (Integer.parseInt(firstTime.substring(0, pos)) * 100)
                        + Integer.parseInt(firstTime.substring(pos + 1));
            } else {
                iFirst = iFirst + (Integer.parseInt(firstTime) * 100);
            }

            // calculate the second time string to integer
            pos = secondTime.indexOf(timeDelm);
            int iSecond = Integer.parseInt(secondTime.substring(0, pos)) * 10000;
            secondTime = secondTime.substring(pos + 1);
            pos = secondTime.indexOf(timeDelm);

            if (pos > 0) {
                iSecond = iSecond + (Integer.parseInt(secondTime.substring(0, pos)) * 100)
                        + Integer.parseInt(secondTime.substring(pos + 1));
            } else {
                iSecond = iSecond + (Integer.parseInt(secondTime) * 100);
            }

            // compare two
            if (iFirst == iSecond) {
                return 0;
            } else if (iFirst > iSecond) {
                return 1;
            } else {
                return -1;
            }
        } catch (Exception e) {
            return -2;
        }
    }

    /**
     * 根據規定格式的字元串得到Calendar.<br>
     * <br>
     * @param dateString 日期串.
     * @return 對應Calendar
     */
    public static Calendar getCalendar(String dateString) {
        Calendar calendar = Calendar.getInstance();
        String[] items = dateString.split("[-| |:]");
        int len = items.length;
        if (len > 0) {
            calendar.set(Calendar.YEAR, Integer.parseInt(items[0]));
        }
        if (len > 1) {
            calendar.set(Calendar.MONTH, Integer.parseInt(items[1]) - 1);
        } else {
            calendar.set(Calendar.MONTH, 0);
        }
        if (len > 2) {
            calendar.set(Calendar.DATE, Integer.parseInt(items[2]));
        } else {
            calendar.set(Calendar.DATE, 1);
        }
        if (len > 3) {
            calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(items[3]));
        } else {
            calendar.set(Calendar.HOUR_OF_DAY, 0);
        }
        if (len > 4) {
            calendar.set(Calendar.MINUTE, Integer.parseInt(items[4]));
        } else {
            calendar.set(Calendar.MINUTE, 0);
        }
        if (len > 5) {
            calendar.set(Calendar.SECOND, Integer.parseInt(items[5]));
        } else {
            calendar.set(Calendar.SECOND, 0);
        }
        return calendar;
    }

    /**
     * 得到與目前日期相差指定天數的日期字元串.<br>
     * <br>
     * @param days 前後的天數,正值為後, 負值為前.
     * @return 日期字元串
     */
    public static String getCertainDate(int days) {
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DATE, days);
        return getStringFromDate(calendar.getTime(), FORMAT_DATE);
    }

    /**
     * 得到與指定日期相差指定天數的日期字元串.<br>
     * <br>
     * @param dateString 指定的日期.
     * @param days 前後的天數,正值為後, 負值為前.
     * @return 日期字元串
     */
    public static String getCertainDate(String dateString, int days) {
        Calendar calendar = getCalendar(dateString);
        calendar.add(Calendar.DATE, days);
        return getStringFromDate(calendar.getTime(), FORMAT_DATE);
    }

    /**
     * 得到與指定日期相差指定天數的日期字元串.<br>
     * <br>
     * @param dateString 指定的日期.
     * @param period 前後的天數,正值為後, 負值為前.
     * @param periodType 周期類别 可以是天、月、年.
     * @return 日期字元串
     */
    public static String getCertainDate(String dateString, int period, int periodType) {
        Calendar calendar = getCalendar(dateString);

        switch (periodType) {
        case 1: // 天
            calendar.add(Calendar.DATE, period);
            break;
        case 2: // 月
            calendar.add(Calendar.MONTH, period);
            break;
        case 3: // 年
            calendar.add(Calendar.MONTH, period * 12);
            break;
        default:
        }
        return getStringFromDate(calendar.getTime(), FORMAT_DATE);
    }

    /**
     * 某日期(帶時間)加上幾天得到另外一個日期(帶時間).<br>
     * <br>
     * @param datetime 需要調整的日期(帶時間).
     * @param days 調整天數.
     * @return 調整後的日期(帶時間)
     */
    public static String getCertainDatetime(String datetime, int days) {
        Date curDate = getDateFromString(datetime, FORMAT_DATETIME);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(curDate);
        calendar.add(Calendar.DATE, days);
        return getStringFromDate(calendar.getTime(), FORMAT_DATETIME);
    }

    /**
     * 得到與目前日期相差指定月數的日期字元串.
     * @param dif 前後的月數,正值為後, 負值為前.
     * @return 日期字元串
     */
    public static String getCertainMonth(int dif) {
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.MONTH, dif);
        return getStringFromDate(calendar.getTime(), FORMAT_DATE);
    }

    /**
     * 得到與目前日期相差指定月數的日期字元串.
     * @param dif 前後的月數,正值為後, 負值為前.
     * @param format 格式
     * @return 日期字元串
     */
    public static String getCertainMonth(int dif, String format) {
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.MONTH, dif);
        return getStringFromDate(calendar.getTime(), format);
    }

    /**
     * 得到目前日期的中文日期字元串.<br>
     * <br>
     * @return 中文日期字元串
     */
    public static String getChineseDate() {
        return getChineseDate(getDate());
    }

    /**
     * 根據日期值得到中文日期字元串.<br>
     * <br>
     * @param date 日期值.
     * @return 中文日期字元串
     */
    public static String getChineseDate(String date) {
        if (date.length() < Integer.valueOf("10")) {
            return "";
        } else {
            String year = date.substring(0, 4); // 年
            String month = date.substring(5, 7); // 月
            String day = date.substring(8, 10); // 日
            String y1 = year.substring(0, 1); // 年 字元1
            String y2 = year.substring(1, 2); // 年 字元1
            String y3 = year.substring(2, 3); // 年 字元3
            String y4 = year.substring(3, 4); // 年 字元4
            String m2 = month.substring(1, 2); // 月 字元2
            String d1 = day.substring(0, 1); // 日 1
            String d2 = day.substring(1, 2); // 日 2
            String cy1 = getChineseNum(y1);
            String cy2 = getChineseNum(y2);
            String cy3 = getChineseNum(y3);
            String cy4 = getChineseNum(y4);
            String cm2 = getChineseNum(m2);
            String cd1 = getChineseNum(d1);
            String cd2 = getChineseNum(d2);
            String cYear = cy1 + cy2 + cy3 + cy4 + "年";
            String cMonth = "月";

            if (Integer.parseInt(month) > 9) {
                cMonth = "十" + cm2 + cMonth;
            } else {
                cMonth = cm2 + cMonth;
            }

            String cDay = "日";

            if (Integer.parseInt(day) > 9) {
                cDay = cd1 + "十" + cd2 + cDay;
            } else {
                cDay = cd2 + cDay;
            }

            String chineseday = cYear + cMonth + cDay;
            return chineseday;
        }
    }

    /**
     * 得到目前日期的星期數 : 例如 '星期一', '星期二'等.<br>
     * <br>
     * @return 目前日期的星期數
     */
    public static String getChineseDayOfWeek() {
        return getChineseDayOfWeek(getDate());
    }

    /**
     * 得到指定日期的星期數.<br>
     * <br>
     * @param strDate 指定日期字元串.
     * @return 指定日期的星期數
     */
    public static String getChineseDayOfWeek(String strDate) {
        Calendar calendar = getCalendar(strDate);

        int week = calendar.get(Calendar.DAY_OF_WEEK);
        String strWeek = "";

        switch (week) {
        case Calendar.SUNDAY:
            strWeek = "星期日";
            break;
        case Calendar.MONDAY:
            strWeek = "星期一";
            break;
        case Calendar.TUESDAY:
            strWeek = "星期二";
            break;
        case Calendar.WEDNESDAY:
            strWeek = "星期三";
            break;
        case Calendar.THURSDAY:
            strWeek = "星期四";
            break;
        case Calendar.FRIDAY:
            strWeek = "星期五";
            break;
        case Calendar.SATURDAY:
            strWeek = "星期六";
            break;
        default:
            strWeek = "星期一";
            break;
        }

        return strWeek;
    }

    /**
     * 根據數字得到中文數字.<br>
     * <br>
     * @param number 數字.
     * @return 中文數字
     */
    public static String getChineseNum(String number) {
        String chinese = "";
        int x = Integer.parseInt(number);

        switch (x) {
        case 0:
            chinese = "零";
            break;
        case 1:
            chinese = "一";
            break;
        case 2:
            chinese = "二";
            break;
        case 3:
            chinese = "三";
            break;
        case 4:
            chinese = "四";
            break;
        case 5:
            chinese = "五";
            break;
        case 6:
            chinese = "六";
            break;
        case 7:
            chinese = "七";
            break;
        case 8:
            chinese = "八";
            break;
        case 9:
            chinese = "九";
            break;
        default:
        }
        return chinese;
    }

    /**
     * 根據日期值得到中文日期字元串.<br>
     * <br>
     * @param date 給定日期.
     * @return 2005年09月23日格式的日期
     */
    public static String getChineseTwoDate(String date) {
        if (date.length() < 10) {
            return "";
        } else {
            String year = date.substring(0, 4); // 年
            String month = date.substring(5, 7); // 月
            String day = date.substring(8, 10); // 日

            return year + "年" + month + "月" + day + "日";
        }
    }

    /**
     * 自定義目前時間格式.<br>
     * <br>
     * @param customFormat 自定義格式
     * @return 日期時間字元串
     */
    public static String getCustomDateTime(String customFormat) {
        Calendar calendar = Calendar.getInstance();
        return getStringFromDate(calendar.getTime(), customFormat);
    }

    /**
     * 得到目前的日期字元串.<br>
     * <br>
     * @return 日期字元串
     */
    public static String getDate() {
        return getDate(Calendar.getInstance());
    }

    /**
     * 得到指定日期的字元串.<br>
     * <br>
     * @param calendar 指定的日期.
     * @return 日期字元串
     */
    public static String getDate(Calendar calendar) {
        return getStringFromDate(calendar.getTime(), FORMAT_DATE);
    }

    /**
     * 得到目前的日期字元串.<br>
     * <br>
     * @return 日期字元串
     */
    public static String getDateCN() {
        return getStringFromDate(Calendar.getInstance().getTime(), FORMAT_DATE_CN);
    }

    /**
     * 得到日期字元串.<br>
     * <br>
     * @param dateStr 日期字元串
     * @return 日期字元串
     */
    public static String getDateCN(String dateStr) {
        Date date = getDateFromString(dateStr);
        return getStringFromDate(date, FORMAT_DATE_CN);
    }

    /**
     * 某日期加上幾天得到另外一個日期.<br>
     * <br>
     * @param addNum 要增加的天數.
     * @param getDate 某日期.
     * @return 與某日期相差addNum天的日期
     */
    public static String getDateAdded(int addNum, String getDate) {
        return getCertainDate(getDate, addNum);
    }

    /**
     * 将指定格式的字元串格式化為日期.<br>
     * <br>
     * @param s 字元串内容.
     * @return 日期
     */
    public static Date getDateFromString(String s) {
        int len = s.length();
        String format;
        switch (len) {
        case 19:
            format = FORMAT_DATETIME;
            break;
        case 24:
            format = FORMAT_TIMESTAMP;
            break;
        default:
            format = FORMAT_DATE;
        }
        return getDateFromString(s, format);
    }

    /**
     * 将指定格式的字元串格式化為日期.<br>
     * <br>
     * @param s 字元串内容.
     * @param format 字元串格式.
     * @return 日期
     */
    public static Date getDateFromString(String s, String format) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(format);
            return sdf.parse(s);
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 得到目前的日期時間字元串.<br>
     * <br>
     * @return 日期時間字元串
     */
    public static String getDatetime() {
        Calendar calendar = Calendar.getInstance();
        return getStringFromDate(calendar.getTime(), FORMAT_DATETIME);
    }

    /**
     * 得到目前的日期時間字元串.<br>
     * <br>
     * @param millTimes 毫秒時間
     * @return 日期時間字元串
     */
    public static String getDatetime(long millTimes) {
        return getStringFromDate(new Date(millTimes), FORMAT_DATETIME);
    }


    /**
     * 得到目前的日期時間字元串.<br>
     * <br>
     * @param time 指定時間
     * @return 日期時間字元串
     */
    public static String getDatetime(Date time) {
        return getStringFromDate(time, FORMAT_DATETIME);
    }

    /**
     * 得到目前的日期時間字元串,到小時分鐘.<br>
     * <br>
     * @return 日期時間字元串
     */
    public static String getDateTimeHm() {
        Calendar calendar = Calendar.getInstance();
        return getStringFromDate(calendar.getTime(), FORMAT_DATETIME_HM);
    }

    /**
     * 得到目前的日期時間字元串.<br>
     * <br>
     * @return 日期時間字元串
     */
    public static String getDatetimeW3C() {
        return getDate() + "T" + getTime();
    }

    /**
     *
     * @param format 指定時間格式
     * @return 指定格式目前時間
     */
    public static String getDatetime(String format) {
    	Calendar calendar = Calendar.getInstance();
    	return getStringFromDate(calendar.getTime(), format);
    }

    /**
     * 得到整點的日期時間字元串.<br>
     * <br>
     * @return 日期時間字元串
     */
    public static String getDatetimeZd() {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        return getStringFromDate(calendar.getTime(), FORMAT_DATETIME);
    }

    /**
     * 得到目前的日期.<br>
     * <br>
     * @return 目前日期
     */
    public static int getDay() {
        Calendar calendar = Calendar.getInstance();
        return calendar.get(Calendar.DATE);
    }

    /**
     * 擷取相差時間,精确到分鐘.<br>
     * <br>
     * @param beginTime 開始時間.
     * @param endTime 結束時間.
     * @return 相差時間
     */
    public static long getDiffTime(String beginTime, String endTime) {
        return getDiffTime(beginTime, endTime, FORMAT_DATETIME);
    }

    /**
     * 擷取相差時間,後一個時間減去前一個時間<br>
     * <br>
     * @param beginTime 開始時間。
     * @param endTime 結束時間。
     * @param format 時間格式
     * @return 相差時間
     */
    public static long getDiffTime(String beginTime, String endTime, String format) {
        if (beginTime.length() == 0) {
            beginTime = getDatetime();
        }
        if (endTime.length() == 0) {
            endTime = getDatetime();
        }
        Date eTime = getDateFromString(endTime, format);
        Date bTime = getDateFromString(beginTime, format);
        return eTime.getTime() - bTime.getTime();
    }

    /**
     * 比較兩個時間,判斷是否開始時間早于結束時間 <br>
     * @param begin 開始時間.
     * @param end 結束時間.
     * @return 是否開始時間早于結束時間
     */
    public static boolean isBefore(String begin, String end) {
        Date beginDate = getDateFromString(begin);
        Date endDate = getDateFromString(end);
        return beginDate.before(endDate);
    }

    /**
     * 擷取相差時間,精确到分鐘.<br>
     * <br>
     * @param beginTime 開始時間.
     * @param endTime 結束時間.
     * @return 相差時間
     */
    public static String getDiffString(String beginTime, String endTime) {
        try {
            if (endTime == null || endTime.length() == 0) {
                endTime = getDatetime();
            }
            Date eTime = getDateFromString(endTime, FORMAT_DATETIME);
            Date bTime = getDateFromString(beginTime, FORMAT_DATETIME);
            long time = eTime.getTime() - bTime.getTime();
            StringBuilder sb = new StringBuilder();
            int day = (int) Math.floor(time / (24 * 3600000));
            if (day > 0) {
                sb.append(day).append("天");
            }
            time = time % (24 * 3600000);
            int hour = (int) Math.floor(time / 3600000);
            if (hour > 0) {
                sb.append(hour).append("小時");
            }
            time = time % 3600000;
            int minute = (int) Math.ceil(time / 60000);
            if (minute > 0) {
                sb.append(minute).append("分鐘");
            }
            return sb.toString();
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }

    /**
     * 得到本周星期一的日期.<br>
     * <br>
     * @return 日期字元串
     */
    public static String getFirstDateOfWeek() {
        return getFirstDateOfWeek(getDate());
    }

    /**
     * 得到指定日期的星期一的日期.<br>
     * <br>
     * @param dateString 日期字元串.
     * @return 本周星期一的日期
     */
    public static String getFirstDateOfWeek(String dateString) {
        Calendar calendar = getCalendar(dateString);
        int iCount;
        if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
            iCount = -6;
        } else {
            iCount = Calendar.MONDAY - calendar.get(Calendar.DAY_OF_WEEK);
        }

        return getCertainDate(dateString, iCount);
    }

    /**
     * 得到目前的全時間字元串,包含毫秒.<br>
     * <br>
     * @return 日期時間字元串
     */
    public static String getFulltime() {
        Calendar calendar = Calendar.getInstance();
        return getStringFromDate(calendar.getTime(), FORMAT_FULLTIME);
    }

    /**
     * 得到目前的月份.<br>
     * <br>
     * @return 目前月份
     */
    public static int getMonth() {
        Calendar calendar = Calendar.getInstance();
        return calendar.get(Calendar.MONTH) + 1;
    }

    /**
     * 取得兩日期間的月份差數.
     * @param startDate 起始日期.
     * @param endDate 結束日期.
     * @return 月份差數
     */
    public static int getMonthDiff(String startDate, String endDate) {
        String[] startArray = startDate.split("-");
        String[] endArray = endDate.split("-");
        int startYear = Integer.parseInt(startArray[0]);
        int startMonth = Integer.parseInt(startArray[1]);
        int endYear = Integer.parseInt(endArray[0]);
        int endMonth = Integer.parseInt(endArray[1]);
        return Math.abs((endYear - startYear) * 12 + endMonth - startMonth);
    }

    /**
     * 得到目前日期所在星期的起始的日期.<br>
     * <br>
     * @param date 目前日期.
     * @return Date 傳回的日期
     */
    public static Date getWeekFirstDay(Date date) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        int weekDay = c.get(Calendar.DAY_OF_WEEK) == 1 ? 8 : c.get(Calendar.DAY_OF_WEEK);
        c.add(Calendar.DATE, Calendar.MONDAY - weekDay);
        Date start = c.getTime();
        // c.add(Calendar.DATE, 6);
        // Date end = c.getTime();
        // System.out.print(String.format("%1$tY-%1$tm-%1$td", start) + " "+ String.format("%1$tY-%1$tm-%1$td", end));
        return start;
    }

    /**
     * 得到目前日期的所在月的第一天的日期.<br>
     * <br>
     * @param date 目前日期.
     * @return String 傳回的日期
     */
    public static Date getMonthFirstDay(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        String month = String.valueOf(cal.get(Calendar.MONTH) + 1);
        String year = String.valueOf(cal.get(Calendar.YEAR));
        if (Integer.parseInt(month) < 10) {
            month = "0" + month;
        }
        String resultStr = year + "-" + month + "-01" + " 00:00:00";
        Date result = null;
        result = getDateFromString(resultStr, "yyyy-MM-dd hh:mm:ss");
        return result;
    }

    /**
     * 得到目前日期的所在月的第一天的日期.<br>
     * <br>
     * @param date 目前日期.
     * @return String 傳回的日期
     */
    public static String getMonthFirstDay(String date) {
        Calendar cal = getCalendar(date);
        String month = String.valueOf(cal.get(Calendar.MONTH) + 1);
        String year = String.valueOf(cal.get(Calendar.YEAR));
        if (Integer.parseInt(month) < 10) {
            month = "0" + month;
        }
        return year + "-" + month + "-01";
    }

    /**
     * 得到目前日期的所在月的最後一天的日期.
     * @param date 目前日期.
     * @return 傳回的日期
     */
    public static String getMonthLastDay(String date) {
        Calendar cal = getCalendar(date);
        int month = cal.get(Calendar.MONTH) + 1;
        int year = cal.get(Calendar.YEAR);
        int nextMonth = month + 1;
        int nextYear = year;
        if (nextMonth == 13) {
            nextMonth = 1;
            nextYear = nextYear + 1;
        }
        String nextMonthFirstDay = nextYear + "-" + nextMonth + "-01";
        return getCertainDate(nextMonthFirstDay, -1);
    }

    /**
     * 将日期格式化為指定的字元串.<br>
     * <br>
     * @param d 日期.
     * @param format 輸出字元串格式.
     * @return 日期字元串
     */
    public static String getStringFromDate(Date d, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(d);
    }

    /**
     * 将指定日期格式化成時間字元串
     * @param d 指定日期
     * @return 格式化成時間
     */
    public static String formatTime(Date d) {
        return getStringFromDate(d, FORMAT_TIME);
    }

    /**
     * 将指定日期格式化成時間字元串
     * @param d 指定日期
     * @return 格式化成時間
     */
    public static String formatDate(Date d) {
        return getStringFromDate(d, FORMAT_DATE);
    }

    /**
     * 将指定日期格式化成時間字元串
     * @param d 指定日期
     * @return 時間字元串
     */
    public static String formatDatetime(Date d) {
        return getStringFromDate(d, FORMAT_DATETIME);
    }

    /**
     * 得到目前的純時間字元串.<br>
     * <br>
     * @return 時間字元串
     */
    public static String getTime() {
        Calendar calendar = Calendar.getInstance();
        return getStringFromDate(calendar.getTime(), FORMAT_TIME);
    }

    /**
     * 如果目前日期是周六或者周日,則傳回下周一的日期.<br>
     * <br>
     * @param date 目前日期.
     * @return 下周一日期
     */
    public static String getWorkDate(final String date) {
        Date curDate = getDateFromString(date);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(curDate);
        int week = calendar.get(Calendar.DAY_OF_WEEK);

        if (week == Calendar.SATURDAY) {
            calendar.add(Calendar.DATE, 2);
        } else if (week == Calendar.SUNDAY) {
            calendar.add(Calendar.DATE, 1);
        }
        return getDate(calendar);
    }

    /**
     * 得到目前的年份.<br>
     * <br>
     * @return 目前年份
     */
    public static int getYear() {
        Calendar calendar = Calendar.getInstance();
        return calendar.get(Calendar.YEAR);
    }

    /**
     * 得到目前的年月字元串 <br>
     * @return 年月字元串
     */
    public static String getYearMonth() {
        return getYearMonth(0);
    }

    /**
     * 得到目前日期指定月份差額的年月字元串 <br>
     * @param monthDiff 月份差額:-1 上個月,1 下個月
     * @return 年月字元串
     */
    public static String getYearMonth(int monthDiff) {
        Calendar calendar = Calendar.getInstance();
        return getYearMonth(calendar, monthDiff);
    }

    /**
     * 得到指定日期月份差額的年月字元串 <br>
     * @param calendar 指定日期
     * @param monthDiff 月份差額:-1 上個月,1 下個月
     * @return 年月字元串
     */
    public static String getYearMonth(Calendar calendar, int monthDiff) {
        calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) + monthDiff);
        return getStringFromDate(calendar.getTime(), FORMAT_YEARMONTH);
    }

    /**
     * 目前日期與參數傳遞的日期的相差天數.<br>
     * <br>
     * @param dateinfo 指定的日期.
     * @return 相差的天數
     */
    public static int selectDateDiff(String dateinfo) {
        return selectDateDiff(dateinfo, getDate());
    }

    /**
     * 當得到兩個日期相差天數.<br>
     * <br>
     * @param first 第一個日期.
     * @param second 第二個日期.
     * @return 相差的天數
     */
    public static int selectDateDiff(String first, String second) {
        int dif = 0;
        try {
            Date fDate = getDateFromString(first, FORMAT_DATE);
            Date sDate = getDateFromString(second, FORMAT_DATE);
            dif = (int) ((fDate.getTime() - sDate.getTime()) / 86400000);
        } catch (Exception e) {
            dif = 0;
        }
        return dif;
    }

    /**
     * 兩個時間相差小時數
     * @param beginTime 開始時間
     * @param endTime 結束時間
     * @return 相差小時數
     */
    public static double getDiffHoure(String beginTime, String endTime) {
        double dif = 0.00;
        try {
            Date eDatetime = DateUtils.getDateFromString(endTime, "yyyy-MM-dd HH:mm:ss");
            Date bDatetime = DateUtils.getDateFromString(beginTime, "yyyy-MM-dd HH:mm:ss");
            double ed = eDatetime.getTime();
            double sd = bDatetime.getTime();
            BigDecimal et = new BigDecimal(ed / 1000 / 3600 - sd / 1000 / 3600);
            dif = et.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        } catch (Exception e) {
            dif = 0;
        }
        return dif;
    }

    /**
     * 擷取目前時間戳字元串(帶毫秒)
     * @return 時間字元串(帶毫秒)
     */
    public static String getDatetimeTS() {
        Calendar calendar = Calendar.getInstance();
        return getStringFromDate(calendar.getTime(), FORMAT_TIMESTAMP);
    }

    /**
     * 擷取目前時間戳
     * @return 時間戳
     */
    public static Timestamp getTimestamp() {
        return new Timestamp(System.currentTimeMillis());
    }

    /**
     * 擷取時間戳
     * @param timestamp 時間戳字元串
     * @return 時間戳
     */
    public static Timestamp getTimestamp(String timestamp) {
        return new Timestamp(getDateFromString(timestamp, FORMAT_TIMESTAMP).getTime());
    }

    /**
     * 擷取對應的時間戳字元串
     * @param tm 時間戳
     * @return 時間戳字元串
     */
    public static String getByTimestamp(Timestamp tm) {
        if (tm == null) {
            return "";
        } else {
            Date date = new Date(tm.getTime());
            return getStringFromDate(date, FORMAT_TIMESTAMP);
        }
    }

    /**
     * Date format pattern used to parse HTTP date headers in RFC 1123 format.
     */
    public static final String PATTERN_RFC1123 = "EEE, dd MMM yyyy HH:mm:ss zzz";

    /**
     * Date format pattern used to parse HTTP date headers in RFC 1036 format.
     */
    public static final String PATTERN_RFC1036 = "EEEE, dd-MMM-yy HH:mm:ss zzz";

    /**
     * Date format pattern used to parse HTTP date headers in ANSI C <code>asctime()</code> format.
     */
    public static final String PATTERN_ASCTIME = "EEE MMM d HH:mm:ss yyyy";
    // These are included for back compat
    private static final Collection<String> DEFAULT_HTTP_CLIENT_PATTERNS = Arrays.asList(PATTERN_ASCTIME,
            PATTERN_RFC1036, PATTERN_RFC1123);

    private static final Date DEFAULT_TWO_DIGIT_YEAR_START;

    static {
        Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.US);
        calendar.set(2000, Calendar.JANUARY, 1, 0, 0);
        DEFAULT_TWO_DIGIT_YEAR_START = calendar.getTime();
    }

    private static final TimeZone GMT = TimeZone.getTimeZone("GMT");

    // ---------------------------------------------------------------------------------------

    /**
     * A suite of default date formats that can be parsed, and thus transformed to the Solr specific format
     */
    public static final Collection<String> DEFAULT_DATE_FORMATS = new ArrayList<String>();

    static {
        DEFAULT_DATE_FORMATS.add("yyyy-MM-dd'T'HH:mm:ss'Z'");
        DEFAULT_DATE_FORMATS.add("yyyy-MM-dd'T'HH:mm:ss");
        DEFAULT_DATE_FORMATS.add("yyyy-MM-dd hh:mm:ss");
        DEFAULT_DATE_FORMATS.add("yyyy-MM-dd HH:mm:ss");
        DEFAULT_DATE_FORMATS.add("yyyy-MM-dd HH:mm");
        DEFAULT_DATE_FORMATS.add("yyyy-MM-dd");
        DEFAULT_DATE_FORMATS.add("yyyy/MM/dd hh:mm:ss");
        DEFAULT_DATE_FORMATS.add("yyyy/MM/dd HH:mm:ss");
        DEFAULT_DATE_FORMATS.add("yyyy/MM/dd HH:mm");
        DEFAULT_DATE_FORMATS.add("yyyy/MM/dd");
        DEFAULT_DATE_FORMATS.add("EEE MMM d hh:mm:ss z yyyy");
        DEFAULT_DATE_FORMATS.addAll(DEFAULT_HTTP_CLIENT_PATTERNS);
    }

    /**
     * Returns a formatter that can be use by the current thread if needed to convert Date objects to the Internal
     * representation.
     *
     * @param d The input date to parse
     * @return The parsed {@link java.util.Date}
     * @throws java.text.ParseException If the input can't be parsed
     * @throws ParseException org.apache.commons.httpclient.util.DateParseException If the input can't be parsed
     */
    public static Date parseDate(String d) throws ParseException {
        return parseDate(d, DEFAULT_DATE_FORMATS);
    }

    /**
     * Returns a formatter that can be use by the current thread if needed to convert Date objects to the Internal
     * representation.
     * @param d date string
     * @param fmts fmts
     * @return Date
     * @throws ParseException org.apache.commons.httpclient.util.DateParseException If the input can't be parsed
     */
    public static Date parseDate(String d, Collection<String> fmts) throws ParseException {
        // 2007-04-26T08:05:04Z
        if (d.endsWith("Z") && d.length() > 20) {
            return getThreadLocalDateFormat().parse(d);
        }
        return parseDate(d, fmts, null);
    }

    /**
     * get timeage string
     * @param date - date
     * @return - string
     */
//    public static String timeAgo(Date date) {
//        PrettyTime p = new PrettyTime(new Locale("zh"));
//        return p.format(date);
//    }

    /**
     * get utc time (solr used utc time)
     * @param date date string,format: yyyy-MM-dd hh:mm:ss
     * @return utc time string
     * @throws IOException ioexception
     */
    public static String getUTCTime(Date date) throws IOException {
        StringBuilder dateBuilder = new StringBuilder();
        formatDate(date, null, dateBuilder);
        return dateBuilder.toString();
    }

    /**
     * Slightly modified from org.apache.commons.httpclient.util.DateUtil.parseDate
     * <p/>
     * Parses the date value using the given date formats.
     *
     * @param dateValue the date value to parse
     * @param dateFormats the date formats to use
     * @param startDate During parsing, two digit years will be placed in the range <code>startDate</code> to
     *            <code>startDate + 100 years</code>. This value may be <code>null</code>. When <code>null</code> is
     *            given as a parameter, year <code>2000</code> will be used.
     * @return the parsed date
     * @throws ParseException if none of the dataFormats could parse the dateValue
     */
    public static Date parseDate(String dateValue, Collection<String> dateFormats, Date startDate)
            throws ParseException {

        if (dateValue == null) {
            throw new IllegalArgumentException("dateValue is null");
        }
        if (dateFormats == null) {
            dateFormats = DEFAULT_HTTP_CLIENT_PATTERNS;
        }
        if (startDate == null) {
            startDate = DEFAULT_TWO_DIGIT_YEAR_START;
        }
        // trim single quotes around date if present
        // see issue #5279
        if (dateValue.length() > 1 && dateValue.startsWith("'") && dateValue.endsWith("'")) {
            dateValue = dateValue.substring(1, dateValue.length() - 1);
        }

        SimpleDateFormat dateParser = null;
        Iterator<String> formatIter = dateFormats.iterator();
        Date parse =null;
        while (formatIter.hasNext()) {
            String format = formatIter.next();
            if (dateParser == null) {
                dateParser = new SimpleDateFormat(format, Locale.US);
//                dateParser.setTimeZone(GMT);
                dateParser.set2DigitYearStart(startDate);
            } else {
                dateParser.applyPattern(format);
            }
            try {
                 parse = dateParser.parse(dateValue);
                 break;
            }catch (Exception e){
                System.out.println(format);
            }
        }
        if (parse ==null){
            throw new ParseException("Unable to parse the date " + dateValue, 0);
        }else{
            return parse;
        }
        // we were unable to parse the date
    }

    /**
     * Returns a formatter that can be use by the current thread if needed to convert Date objects to the Internal
     * representation.
     *
     * @return The {@link java.text.DateFormat} for the current thread
     */
    public static DateFormat getThreadLocalDateFormat() {
        return fmtThreadLocal.get();
    }

    /** utc time zone */
    public static final TimeZone UTC = TimeZone.getTimeZone("UTC");

    private static ThreadLocalDateFormat fmtThreadLocal = new ThreadLocalDateFormat();

    /**
     * @author liwei
     *
     */
    private static class ThreadLocalDateFormat extends ThreadLocal<DateFormat> {
        private DateFormat proto;

        /**
		 *
		 */
        public ThreadLocalDateFormat() {
            super();
            // 2007-04-26T08:05:04Z
            SimpleDateFormat tmp = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
            tmp.setTimeZone(UTC);
            proto = tmp;
        }

        @Override
        protected DateFormat initialValue() {
            return (DateFormat) proto.clone();
        }
    }

    /**
     * Formats the date and returns the calendar instance that was used (which may be reused)
     * @param date <CODE>Date</CODE>
     * @param cal Calendar
     * @param out Appendable
     * @return Calendar
     * @throws IOException IOException
     */
    private static Calendar formatDate(Date date, Calendar cal, Appendable out) throws IOException {
        // using a stringBuilder for numbers can be nice since
        // a temporary string isn't used (it's added directly to the
        // builder's buffer.

        StringBuilder sb = out instanceof StringBuilder ? (StringBuilder) out : new StringBuilder();
        if (cal == null) {
            cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.US);
        }
        cal.setTime(date);

        int i = cal.get(Calendar.YEAR);
        sb.append(i);
        sb.append('-');
        i = cal.get(Calendar.MONTH) + 1; // 0 based, so add 1
        if (i < 10) {
            sb.append('0');
        }
        sb.append(i);
        sb.append('-');
        i = cal.get(Calendar.DAY_OF_MONTH);
        if (i < 10) {
            sb.append('0');
        }
        sb.append(i);
        sb.append('T');
        i = cal.get(Calendar.HOUR_OF_DAY); // 24 hour time format
        if (i < 10) {
            sb.append('0');
        }
        sb.append(i);
        sb.append(':');
        i = cal.get(Calendar.MINUTE);
        if (i < 10) {
            sb.append('0');
        }
        sb.append(i);
        sb.append(':');
        i = cal.get(Calendar.SECOND);
        if (i < 10) {
            sb.append('0');
        }
        sb.append(i);
        i = cal.get(Calendar.MILLISECOND);
        if (i != 0) {
            sb.append('.');
            if (i < 100) {
                sb.append('0');
            }
            if (i < 10) {
                sb.append('0');
            }
            sb.append(i);

            // handle canonical format specifying fractional
            // seconds shall not end in '0'. Given the slowness of
            // integer div/mod, simply checking the last character
            // is probably the fastest way to check.
            int lastIdx = sb.length() - 1;
            if (sb.charAt(lastIdx) == '0') {
                lastIdx--;
                if (sb.charAt(lastIdx) == '0') {
                    lastIdx--;
                }
                sb.setLength(lastIdx + 1);
            }

        }
        sb.append('Z');

        if (out != sb) {
            out.append(sb);
        }

        return cal;
    }

    /**
     *
     * @return 取得目前時間的date對象
     */
    public static Date createDate() {
        return Calendar.getInstance().getTime();
    }

    /**
     * 為指定日期增加一段指定機關的時間
     * @param date 日期對象
     * @param calendarField 時間機關。
     * @param amount 數量
     * @return 增加指定機關之間之後的Date對象
     */
    private static Date add(Date date, int calendarField, int amount) {
        if (date == null) {
            throw new IllegalArgumentException("The date must not be null");
        }
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(calendarField, amount);
        return c.getTime();
    }

    /**
     * 為指定日期增加幾分鐘
     * @param date 指定日期
     * @param amount 增加的數量
     * @return 增加指定機關之間之後的Date對象
     */
    public static Date addMinutes(Date date, int amount) {
        return add(date, Calendar.MINUTE, amount);
    }

    /**
     * 為指定日期增加幾小時
     * @param date 指定日期
     * @param amount 增加的數量
     * @return 增加指定機關之間之後的Date對象
     */
    public static Date addHours(Date date, int amount) {
        return add(date, Calendar.HOUR_OF_DAY, amount);
    }

    /**
     * 為指定日期增加幾天
     * @param date 指定日期
     * @param amount 增加的數量
     * @return 增加指定機關之間之後的Date對象
     */
    public static Date addDays(Date date, int amount) {
        return add(date, Calendar.DAY_OF_MONTH, amount);
    }

    /**
     * 為指定日期增加幾星期
     * @param date 指定日期
     * @param amount 增加的數量
     * @return 增加指定機關之間之後的Date對象
     */
    public static Date addWeeks(Date date, int amount) {
        return add(date, Calendar.WEEK_OF_YEAR, amount);
    }

    /**
     * 為指定日期增加幾個月
     * @param date 指定日期
     * @param amount 增加的數量
     * @return 增加指定機關之間之後的Date對象
     */
    public static Date addMonths(Date date, int amount) {
        return add(date, Calendar.MONTH, amount);
    }

    /**
     * 為指定日期增加幾年
     * @param date 指定日期
     * @param amount 增加的數量
     * @return 增加指定機關之間之後的Date對象
     */
    public static Date addYears(Date date, int amount) {
        return add(date, Calendar.YEAR, amount);
    }

    /**
     *
     * @param month 月
     * @param year 年
     * @return 給定年 對應 月的 天數
     */
    public static int getDayOfMonth(int month, int year) {
        int days = 0;

        if (month == 2) {
            if (year % 4 != 0) {
                days = 28;
            } else {
                if (year % 100 == 0 && year % 400 != 0) {
                    days = 28;
                } else {
                    days = 29;
                }
            }

        } else {
            switch (month) {
            case 1:
                days = 31;
                break;
            case 3:
                days = 31;
                break;
            case 4:
                days = 30;
                break;
            case 5:
                days = 31;
                break;
            case 6:
                days = 30;
                break;
            case 7:
                days = 31;
                break;
            case 8:
                days = 31;
                break;
            case 9:
                days = 30;
                break;
            case 10:
                days = 31;
                break;
            case 11:
                days = 30;
                break;
            case 12:
                days = 31;
                break;
            default:
                break;
            }
        }

        return days;

    }

    /**
     * 執行測試方法
     * @param args 參數
     */
    public static void main(String[] args) {
        // get utc time form Date object
        Date now = new Date();
        String timeStr = "";
        try {
            timeStr = getUTCTime(now);
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        System.out.println(timeStr);

        // parse utc time to Date object
        try {
            Date result = parseDate(timeStr);
            System.out.println(result);
        } catch (ParseException e) {
            e.printStackTrace();
        }

//        String timeAgo = timeAgo(new Date());
//        System.out.println(timeAgo);

        Date d = getDateFromString("2013-10-30 21:40:40:256");
        System.out.println(d);

    }

}