1. 程式人生 > >JAVA後臺時間各種格式相互轉換

JAVA後臺時間各種格式相互轉換

public class DateUtil {
	private static final Log log = LogFactory.getLog(DateUtil.class);

	/** 年月日 時分秒模式字串 */
	public static final String YEAR_MONTH_DAY_HOUR_MINUTE_SECOND_PATTERN = "yyyy-MM-dd HH:mm:ss";

	/** 年月日模式字串 */
	public static final String YEAR_MONTH_DAY_PATTERN = "yyyy-MM-dd";

	/** 時分秒模式字串 */
	public static final String HOUR_MINUTE_SECOND_PATTERN = "HH:mm:ss";

	/** 年月日時分模式字串 */
	public static final String YMDHMS_PATTERN = "yyyy-MM-dd HH:mm";
	/** 年月日時模式字串 */
	public static final String YMDH_PATTERN = "yyyy-MM-dd HH";
	/**
	 * 獲取時間差
	 * 
	 * @param date1
	 * @param date2
	 * @return 小時數
	 */
	public static int getHourDifference(Date before, Date after) {
		if (before != null && after != null) {
			return (int) ((before.getTime() - after.getTime()) / (1000 * 60));
		}
		return 0;
	}
	
	/**
     * 獲取時間差 保留小數點後一位有效數字
     * @param date1
     * @param date2
     * @return 小時數
     */
    public static Double getDoubleHourDifference(Date before, Date after){
        Double hour = 0d;
        if(before!=null && after!=null){
            DecimalFormat df = new DecimalFormat("#.0");
            Long l = before.getTime() - after.getTime();
            hour = l.doubleValue()/(1000 * 60 * 60);
            hour = Double.parseDouble(df.format(hour));
        }
        return hour;
    }
    
    /**
     * 獲取時間差 
     * @param date1
     * @param date2
     * @return 分
     */
    public static int getMinuteDifference(Date before, Date after){
    	if(before!=null && after!=null){
    		return (int) ((before.getTime() - after.getTime())/(1000 * 60 * 60 * 60)); 
    	}
    	return 0;
    }
    
	/**
	 * 獲取當前時間減去xx小時前的時間
	 * 
	 * @param date
	 * @param hour
	 * @return
	 */
	public static Date getDateDifference(int hour) {
		return addHour(new Date(), -hour);
	}

	/**
	 * 根據傳入的年、月、日構造日期物件
	 * 
	 * @param year
	 *            年
	 * @param month
	 *            月
	 * @param date
	 *            日
	 * @return 返回根據傳入的年、月、日構造的日期物件
	 */
	public static Date getDate(final int year, final int month, final int date) {
		Calendar c = Calendar.getInstance();
		c.set(year + 1900, month, date);
		return c.getTime();
	}

	/**
	 * 根據傳入的日期格式化pattern將傳入的日期格式化成字串。
	 * 
	 * @param date
	 *            要格式化的日期物件
	 * @param pattern
	 *            日期格式化pattern
	 * @return 格式化後的日期字串
	 */
	public static String format(final Date date, final String pattern) {
		DateFormat df = new SimpleDateFormat(pattern);
		return df.format(date);
	}

	/**
	 * 將傳入的日期按照預設形勢轉換成字串(yyyy-MM-dd)
	 * 
	 * @param date
	 *            要格式化的日期物件
	 * @return 格式化後的日期字串
	 */
	public static String format(final Date date) {
		return format(date, YEAR_MONTH_DAY_PATTERN);
	}

	/**
	 * 獲取(yyyy-MM-dd HH:mm)格式的日期時間
	 * 
	 * @param date
	 *            要格式化的日期物件
	 * @return 格式化後的日期字串
	 */
	public static String formatDateTime(final Date date) {
		return format(date, YMDHMS_PATTERN);
	}
	/**
	 * 獲取(yyyy-MM-dd HH:mm:ss)格式的日期時間
	 * 
	 * @param date
	 *            要格式化的日期物件
	 * @return 格式化後的日期字串
	 */
	public static String formatLongDateTime(final Date date) {
		return format(date, YEAR_MONTH_DAY_HOUR_MINUTE_SECOND_PATTERN);
	}
	/**
	 * 獲取(yyyy-MM-dd HH)格式的日期時間
	 * 
	 * @param date
	 *            要格式化的日期物件
	 * @return 格式化後的日期字串
	 */
	public static String formatYMDHDateTime(final Date date) {
		return format(date, YMDH_PATTERN);
	}
	/**
	 * 根據傳入的日期格式化patter將傳入的字串轉換成日期物件
	 * 
	 * @param dateStr
	 *            要轉換的字串
	 * @param pattern
	 *            日期格式化pattern
	 * @return 轉換後的日期物件
	 * @throws ParseException
	 *             如果傳入的字串格式不合法
	 */
	public static Date parse(final String dateStr, final String pattern)
			throws ParseException {
		DateFormat df = new SimpleDateFormat(pattern);
		return df.parse(dateStr);
	}

	/**
	 * 將傳入的字串按照預設格式轉換為日期物件(yyyy-MM-dd)
	 * 
	 * @param dateStr
	 *            要轉換的字串
	 * @return 轉換後的日期物件
	 * @throws ParseException
	 *             如果傳入的字串格式不符合預設格式(如果傳入的字串格式不合法)
	 */
	public static Date parse(final String dateStr) throws ParseException {
		if (dateStr.length() == YEAR_MONTH_DAY_PATTERN.length()) {
			return parse(dateStr + " 00:00:00", YEAR_MONTH_DAY_PATTERN);
		} else if (dateStr.length() == YMDHMS_PATTERN.length()) {
			return parse(dateStr + ":00", YMDHMS_PATTERN);
		} else {
			return parse(dateStr, YEAR_MONTH_DAY_PATTERN);
		}
	}

	/**
	 * 獲取指定日期的中文顯示名(如:2016年11月23日 星期三)
	 * 
	 * @param d
	 *            日期
	 * @return 中文日期
	 */
	public static String getLocalDate(Date d) {
		String date = "";
		if (d != null) {
			Locale l = new Locale("zh", "CN");
			DateFormat df = DateFormat.getDateInstance(DateFormat.FULL, l);
			try {
				date = df.format(d);
			} catch (Exception e) {
				log.error("日期格式轉換出現異常:" + e);
			}
		}
		return date;
	}

	/**
	 * 獲取當前日期的中文顯示名(如:2016年11月23日 星期三)
	 * 
	 * @return 中文顯示名
	 */
	public static String getLocalDate() {
		String date = "";
		Locale l = new Locale("zh", "CN");
		DateFormat df = DateFormat.getDateInstance(DateFormat.FULL, l);
		try {
			date = df.format(new Date());
		} catch (Exception e) {
			log.error("日期格式轉換出現異常:" + e);
		}
		return date;
	}

	/**
	 * 獲取當前時間的中文顯示名(如:下午02時07分00秒)
	 * 
	 * @return 中文顯示時間
	 */
	public static String getLocalTime() {
		Locale l = new Locale("zh", "CN");
		DateFormat df = DateFormat.getTimeInstance(DateFormat.LONG, l);
		String time = "";
		try {
			time = df.format(new Date());
		} catch (Exception e) {
			log.error("日期格式轉換出現異常:" + e);
		}
		return time;
	}

	/**
	 * 獲取指定時間的中文顯示名(如:下午02時07分00秒)
	 * 
	 * @param d
	 *            時間
	 * @return 中文時間
	 */
	public static String getLocalTime(Date d) {
		Locale l = new Locale("zh", "CN");
		DateFormat df = DateFormat.getTimeInstance(DateFormat.LONG, l);
		String time = "";
		try {
			time = df.format(d);
		} catch (Exception e) {
			log.error("日期格式轉換出現異常:" + e);
		}
		return time;
	}

	/**
	 * 獲取指定Date的中文日期與時間(如:2016年11月22日 下午2:07)
	 * 
	 * @param d
	 *            時間
	 * @return 中文日期與時間
	 */
	public static String getLocalDateAndTime(Date d) {
		String dateAndTime = "";
		if (d != null) {
			Locale l = new Locale("zh", "CN");
			DateFormat df = DateFormat.getDateTimeInstance(DateFormat.LONG,
					DateFormat.SHORT, l);
			try {
				dateAndTime = df.format(d);
			} catch (Exception e) {
				log.error("日期格式轉換出現異常:" + e);
			}
		}
		return dateAndTime;
	}

	/**
	 * 將某個日期增加指定年數,並返回結果。如果傳入負數,則為減。
	 * 
	 * @param date
	 *            要操作的日期物件
	 * @param ammount
	 *            要增加年的數目
	 * @return 結果日期物件
	 */
	public static Date addYear(final Date date, final int ammount) {
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		c.add(Calendar.YEAR, ammount);
		return c.getTime();
	}

	/**
	 * 將某個日期增加指定月數,並返回結果。如果傳入負數,則為減。
	 * 
	 * @param date
	 *            要操作的日期物件
	 * @param ammount
	 *            要增加月的數目
	 * @return 結果日期物件
	 */
	public static Date addMonth(final Date date, final int ammount) {
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		c.add(Calendar.MONTH, ammount);
		return c.getTime();
	}

	/**
	 * 將某個日期增加指定天數,並返回結果。如果傳入負數,則為減。
	 * 
	 * @param date
	 *            要操作的日期物件
	 * @param ammount
	 *            要增加天的數目
	 * @return 結果日期物件
	 */
	public static Date addDay(final Date date, final int ammount) {
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		c.add(Calendar.DATE, ammount);
		return c.getTime();
	}

	/**
	 * 將某個日期增加指定小時數,並返回結果。如果傳入負數,則為減。
	 * 
	 * @param date
	 *            要操作的日期物件
	 * @param hour
	 *            要增加天的小時數
	 * @return 結果日期物件
	 */
	public static Date addHour(final Date date, final int hour) {
		Calendar nowDate = Calendar.getInstance();
		nowDate.add(Calendar.HOUR, hour);
		Date agoDate = (Date) nowDate.getTime();
		return agoDate;
	}

	/**
	 * 將某個日期增加指定分鐘數,並返回結果。如果傳入負數,則為減。
	 * 
	 * @param date
	 *            要操作的日期物件
	 * @param minute
	 *            要增加的分鐘數
	 * @return 結果日期物件
	 */
	public static Date addMinute(final Date date, final int minute) {
		Calendar nowDate = Calendar.getInstance();
		nowDate.add(Calendar.MINUTE, minute);
		Date agoDate = (Date) nowDate.getTime();
		return agoDate;
	}
	/**
	 * 返回給定的beforeDate比afterDate早的年數。如果beforeDate晚於afterDate,則 返回負數。
	 * 
	 * @param beforeDate
	 *            要比較的早的日期
	 * @param afterDate
	 *            要比較的晚的日期
	 * @return beforeDate比afterDate早的年數,負數表示晚。
	 */
	public static int beforeYears(final Date beforeDate, final Date afterDate) {
		Calendar beforeCalendar = Calendar.getInstance();
		beforeCalendar.setTime(beforeDate);
		beforeCalendar.set(Calendar.MONTH, 1);
		beforeCalendar.set(Calendar.DATE, 1);
		beforeCalendar.set(Calendar.HOUR, 0);
		beforeCalendar.set(Calendar.SECOND, 0);
		beforeCalendar.set(Calendar.MINUTE, 0);
		Calendar afterCalendar = Calendar.getInstance();
		afterCalendar.setTime(afterDate);
		afterCalendar.set(Calendar.MONTH, 1);
		afterCalendar.set(Calendar.DATE, 1);
		afterCalendar.set(Calendar.HOUR, 0);
		afterCalendar.set(Calendar.SECOND, 0);
		afterCalendar.set(Calendar.MINUTE, 0);
		boolean positive = true;
		if (beforeDate.after(afterDate))
			positive = false;
		int beforeYears = 0;
		while (true) {
			boolean yearEqual = beforeCalendar.get(Calendar.YEAR) == afterCalendar
					.get(Calendar.YEAR);
			if (yearEqual) {
				break;
			} else {
				if (positive) {
					beforeYears++;
					beforeCalendar.add(Calendar.YEAR, 1);
				} else {
					beforeYears--;
					beforeCalendar.add(Calendar.YEAR, -1);
				}
			}
		}
		return beforeYears;
	}

	/**
	 * 返回給定的beforeDate比afterDate早的月數。如果beforeDate晚於afterDate,則 返回負數。
	 * 
	 * @param beforeDate
	 *            要比較的早的日期
	 * @param afterDate
	 *            要比較的晚的日期
	 * @return beforeDate比afterDate早的月數,負數表示晚。
	 */
	public static int beforeMonths(final Date beforeDate, final Date afterDate) {
		Calendar beforeCalendar = Calendar.getInstance();
		beforeCalendar.setTime(beforeDate);
		beforeCalendar.set(Calendar.DATE, 1);
		beforeCalendar.set(Calendar.HOUR, 0);
		beforeCalendar.set(Calendar.SECOND, 0);
		beforeCalendar.set(Calendar.MINUTE, 0);
		Calendar afterCalendar = Calendar.getInstance();
		afterCalendar.setTime(afterDate);
		afterCalendar.set(Calendar.DATE, 1);
		afterCalendar.set(Calendar.HOUR, 0);
		afterCalendar.set(Calendar.SECOND, 0);
		afterCalendar.set(Calendar.MINUTE, 0);
		boolean positive = true;
		if (beforeDate.after(afterDate))
			positive = false;
		int beforeMonths = 0;
		while (true) {
			boolean yearEqual = beforeCalendar.get(Calendar.YEAR) == afterCalendar
					.get(Calendar.YEAR);
			boolean monthEqual = beforeCalendar.get(Calendar.MONTH) == afterCalendar
					.get(Calendar.MONTH);
			if (yearEqual && monthEqual) {
				break;
			} else {
				if (positive) {
					beforeMonths++;
					beforeCalendar.add(Calendar.MONTH, 1);
				} else {
					beforeMonths--;
					beforeCalendar.add(Calendar.MONTH, -1);
				}
			}
		}
		return beforeMonths;
	}

	/**
	 * 返回給定的beforeDate比afterDate早的天數。如果beforeDate晚於afterDate,則 返回負數。
	 * 
	 * @param beforeDate
	 *            要比較的早的日期
	 * @param afterDate
	 *            要比較的晚的日期
	 * @return beforeDate比afterDate早的天數,負數表示晚。
	 */
	public static int beforeDays(final Date beforeDate, final Date afterDate) {
		Calendar beforeCalendar = Calendar.getInstance();
		beforeCalendar.setTime(beforeDate);
		beforeCalendar.set(Calendar.HOUR, 0);
		beforeCalendar.set(Calendar.SECOND, 0);
		beforeCalendar.set(Calendar.MINUTE, 0);
		Calendar afterCalendar = Calendar.getInstance();
		afterCalendar.setTime(afterDate);
		afterCalendar.set(Calendar.HOUR, 0);
		afterCalendar.set(Calendar.SECOND, 0);
		afterCalendar.set(Calendar.MINUTE, 0);
		boolean positive = true;
		if (beforeDate.after(afterDate))
			positive = false;
		int beforeDays = 0;
		while (true) {
			boolean yearEqual = beforeCalendar.get(Calendar.YEAR) == afterCalendar
					.get(Calendar.YEAR);
			boolean monthEqual = beforeCalendar.get(Calendar.MONTH) == afterCalendar
					.get(Calendar.MONTH);
			boolean dayEqual = beforeCalendar.get(Calendar.DATE) == afterCalendar
					.get(Calendar.DATE);
			if (yearEqual && monthEqual && dayEqual) {
				break;
			} else {
				if (positive) {
					beforeDays++;
					beforeCalendar.add(Calendar.DATE, 1);
				} else {
					beforeDays--;
					beforeCalendar.add(Calendar.DATE, -1);
				}
			}
		}
		return beforeDays;
	}

	/**
	 * 返回傳人日期是星期幾:週日是0、週一是1...週六是6
	 * 
	 * @param date
	 * @return
	 */
	public static int getDayOfWeek(Date date) {
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		return c.get(Calendar.DAY_OF_WEEK) - 1;
	}

	/**
	 * 獲取給定日期物件的年
	 * 
	 * @param date
	 *            日期物件
	 * @return 年
	 */
	public static int getYear(final Date date) {
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		return c.get(Calendar.YEAR);
	}

	/**
	 * 獲取給定日期物件的月
	 * 
	 * @param date
	 *            日期物件
	 * @return 月
	 */
	public static int getMonth(final Date date) {
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		return c.get(Calendar.MONTH) + 1;
	}

	/**
	 * 獲取給定日期物件的天
	 * 
	 * @param date
	 *            日期物件
	 * @return 天
	 */
	public static int getDay(final Date date) {
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		return c.get(Calendar.DATE);
	}

	/**
	 * 獲取給定日期物件的時
	 * 
	 * @param date
	 *            日期物件
	 * @return 時
	 */
	public static int getHour(final Date date) {
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		return c.get(Calendar.HOUR_OF_DAY);
	}

	/**
	 * 獲取給定日期物件的分
	 * 
	 * @param date
	 *            日期物件
	 * @return 分
	 */
	public static int getMinute(final Date date) {
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		return c.get(Calendar.MINUTE);
	}

	/**
	 * 獲取給定日期物件的秒
	 * 
	 * @param date
	 *            日期物件
	 * @return 秒
	 */
	public static int getSecond(final Date date) {
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		return c.get(Calendar.SECOND);
	}

	/**
	 * 計算兩個時間相隔的天數小時和分【兩個時間順序無影響】
	 * 
	 * @param befor
	 *            時間引數 1 格式:yyyy-MM-dd HH:mm:ss
	 * @param after
	 *            時間引數 2 格式:yyyy-MM-dd HH:mm:ss
	 * @return long[] 返回值為:{天, 時, 分}
	 */
	public static long[] getDistanceDayHourMin(Date befor,Date after) {
		long day = 0;
		long hour = 0;
		long min = 0;
		try {
			long time1 = befor.getTime();
			long time2 = after.getTime();
			long diff;
			if (time1 < time2) {
				diff = time2 - time1;
			} else {
				diff = time1 - time2;
			}
			day = diff / (24 * 60 * 60 * 1000);
			hour = (diff / (60 * 60 * 1000) - day * 24);
			min = ((diff / (60 * 1000)) - day * 24 * 60 - hour * 60);
		} catch (Exception e) {
			log.error(e.getLocalizedMessage(), e);
		}
		long[] dhm = { day, hour, min };
		return dhm;
	}
	
	/**
	 * 
	* @Title: getDistanceDay 
	* @Description: 計算兩個時間 共持續的天數
	* @param @param befor
	* @param @param after
	* @param @return    設定檔案 
	* @return long    返回型別 
	* @author heweihui
	* @throws
	 */
	public static long getDistanceDay(Date befor,Date after) {
        long day = 0;
        try {
            long time1 = befor.getTime();
            long time2 = after.getTime();
            long diff;
            if (time1 < time2) {
                diff = time2 - time1;
            } else {
                diff = time1 - time2;
            }
            day = diff / (24 * 60 * 60 * 1000) + 1;
            /*if(diff != 0){
            }*/
        } catch (Exception e) {
            log.error(e.getLocalizedMessage(), e);
        }
        return day;
    }
	
	/**
     * 
    * @Title: getStartDate 
    * @Description: 獲取給定日期 增加ammount天 零點的日期  傳入正數則為增加,傳入負數則為減去
    * @param @param date 日期
    * @param @param ammount 天數 
    * @param @return    設定檔案 
    * @return Date    日期
    * @author heweihui
    * @throws
     */
    public static Date getStartDate(final Date date, final int ammount){
        Calendar c = Calendar.getInstance();
        c.setTime(addDay(date,ammount));
        c.set(Calendar.HOUR_OF_DAY, 0);
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);
        c.set(Calendar.MILLISECOND, 0);
        return c.getTime();
    }
    
    /**
     * 
    * @Title: getEndDate 
    * @Description: 獲取給定日期 增加ammount天 末點的日期  傳入正數則為增加,傳入負數則為減去
    * @param @param date
    * @param @param ammount
    * @param @return    設定檔案 
    * @return Date    日期
    * @author heweihui
    * @throws
     */
    public static Date getEndDate(final Date date, final int ammount){
        Calendar c = Calendar.getInstance();
        c.setTime(addDay(date,ammount));
        c.set(Calendar.HOUR_OF_DAY, 23);
        c.set(Calendar.MINUTE, 59);
        c.set(Calendar.SECOND, 59);
        c.set(Calendar.MILLISECOND, 999);
        return c.getTime();
    }

	@Test
	public void test() throws ParseException {
//		System.out.println(getDistanceDayHourMin(
//				parse("2016-12-09 03:23:00",
//						YEAR_MONTH_DAY_HOUR_MINUTE_SECOND_PATTERN),
//				parse("2016-12-07 22:23:00",
//						YEAR_MONTH_DAY_HOUR_MINUTE_SECOND_PATTERN)));
		/*List<String> list =new ArrayList<String>();
		list.add("1");
		list.add("2");
		list.add("3");
		list.add("4");
		list.add("5");
		list.add("6");
		int s=0;int l=2;
		int e=s*l+l;
		List<String> list1= list.subList(s*2, e);
		s++;e=s*l+l;
		List<String> list11= list.subList(s*2, e);	
		s++;e=s*l+l;
		List<String> list12= list.subList(s*2, e);
		s++;e=s*l+l;
		//List<String> list13= list.subList(s*2, e);
		
		System.out.println(getStartDate(new Date(),-2));*/
	    
	    /*Date date = new Date();
	    Date date1 = addDay(date, -1);
	    System.out.println(format(date));
	    System.out.println(format(date1));
	    
	    int a = beforeDays(date1, date);
	    long b = getDistanceDay(date1, date);
	    System.out.println(a);
	    System.out.println(b);*/
	    /*Long day = DateUtil.getDistanceDay(DateUtil.parse("2016-12-26"), DateUtil.parse("2016-12-27"));
	    System.out.println(day);*/
	    /*Double b = 7.88890;
	    BigDecimal decimal = new BigDecimal(b);  
        decimal = decimal.setScale(0, RoundingMode.HALF_UP);  
        System.out.println(decimal);*/
	    /*Dictionary dictionary = new Dictionary();
	    dictionary.setDictp((byte) 9);
        //if (dictp == dictionary.getDictp()) {
	    String a = "omo.xls";
	    String[] b = a.split("\\.");
	    System.out.println(b.length);*/
	    String a = ",1188,1191,10375,10376";
	    System.out.println(a.substring(1));
	    String path = SystemParam.getProperties("APP_MAINTAIN_REPORT_PATH");
	    System.out.println(path);
	}
}