1. 程式人生 > >Java的DateHelper時間處理類

Java的DateHelper時間處理類

package com.org.java7.core.test;

import java.text.DateFormat;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
/**
 * @Author:jilongliang
 * @Date :2012-8-19
 * @Project:JAVA7
 * @Description:時間處理類
 */
@SuppressWarnings("all")
public class DateHelper {
	/**
	 * 字串轉換為java.util.Date<br>
	 * 支援格式為 yyyy.MM.dd G 'at' hh:mm:ss z Example:'2002-1-1 AD at 22:10:59 PSD'<br>
	 * yy/MM/dd HH:mm:ss 如 '2002/1/1 17:55:00'<br>
	 * yy/MM/dd HH:mm:ss pm 如 '2002/1/1 17:55:00 pm'<br>
	 * yy-MM-dd HH:mm:ss 如 '2002-1-1 17:55:00' <br>
	 * yy-MM-dd HH:mm:ss am 如 '2002-1-1 17:55:00 am' <br>
	 * 
	 * @param time
	 *            String 字串<br>
	 * @return Date 日期<br>
	 */
	public static Date getStringToDate(String time) {
		SimpleDateFormat formatter;
		int tempPos = time.indexOf("AD");
		time = time.trim();
		formatter = new SimpleDateFormat("yyyy.MM.dd G 'at' hh:mm:ss z");
		if (tempPos > -1) {
			time = time.substring(0, tempPos) + "公元"
					+ time.substring(tempPos + "AD".length());// china
			formatter = new SimpleDateFormat("yyyy.MM.dd G 'at' hh:mm:ss z");
		}
		tempPos = time.indexOf("-");
		if (tempPos > -1 && (time.indexOf(" ") < 0)) {
			formatter = new SimpleDateFormat("yyyyMMddHHmmssZ");
		} else if ((time.indexOf("/") > -1) && (time.indexOf(" ") > -1)) {
			formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
		} else if ((time.indexOf("-") > -1) && (time.indexOf(" ") > -1)) {
			formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		} else if ((time.indexOf("/") > -1) && (time.indexOf("am") > -1)
				|| (time.indexOf("pm") > -1)) {
			formatter = new SimpleDateFormat("yyyy-MM-dd KK:mm:ss a");
		} else if ((time.indexOf("-") > -1) && (time.indexOf("am") > -1)
				|| (time.indexOf("pm") > -1)) {
			formatter = new SimpleDateFormat("yyyy-MM-dd KK:mm:ss a");
		}
		ParsePosition pos = new ParsePosition(0);
		Date date = formatter.parse(time, pos);
		return date;
	}
	/**
	 * 將java.util.Date 格式轉換為字串格式'yyyy-MM-dd HH:mm:ss'(24小時制)<br>
	 * 如Sat May 11 17:24:21 CST 2002 to '2002-05-11 17:24:21'<br>
	 * 
	 * @param time
	 *            Date 日期<br>
	 * @return String 字串<br>
	 */
	public static String getDateToString(Date time) {
		SimpleDateFormat formatter;
		formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String Time = formatter.format(time);
		return Time;
	}
	/**
	 * 將java.util.Date 格式轉換為字串格式'yyyy-MM-dd HH:mm:ss a'(12小時制)<br>
	 * 如Sat May 11 17:23:22 CST 2002 to '2002-05-11 05:23:22 下午'<br>
	 * 
	 * @param time
	 *            Date 日期<br>
	 * @param x
	 *            int 任意整數如:1<br>
	 * @return String 字串<br>
	 */
	public static String getDateToString(Date time, int x) {
		SimpleDateFormat formatter;
		formatter = new SimpleDateFormat("yyyy-MM-dd KK:mm:ss a");
		String date = formatter.format(time);
		return date;
	}
	/**
	 * 取系統當前時間:返回只值為如下形式 2002-10-30 20:24:39
	 * 
	 * @return String
	 */
	public static String getNow() {
		return getDateToString(new Date());
	}
	/**
	 * 取系統當前時間:返回只值為如下形式 2002-10-30 08:28:56 下午
	 * 
	 * @param hour
	 *            為任意整數
	 * @return String
	 */
	public static String getNow(int hour) {
		return getDateToString(new Date(), hour);
	}
	/**
	 * 獲取小時
	 * 
	 * @return
	 */
	public static String getHour() {
		SimpleDateFormat formatter;
		formatter = new SimpleDateFormat("H");
		String hour = formatter.format(new Date());
		return hour;
	}
	/**
	 * 獲取當前日日期返回 <return>Day</return>
	 */
	public static String getDay() {
		SimpleDateFormat formatter;
		formatter = new SimpleDateFormat("d");
		String day = formatter.format(new Date());
		return day;
	}
	/**
	 * 獲取周
	 * @return
	 */
	public static String getWeek() {
		SimpleDateFormat formatter;
		formatter = new SimpleDateFormat("E");
		String week = formatter.format(new Date());
		return week;
	}
	/**
	 * 獲取上週的第一天
	 * 
	 * @return
	 */
	public static String getBeforeWeekFirstDay() {
		SimpleDateFormat sdf = new SimpleDateFormat();
		Date d = new Date();
		return null;

	}
	/**
	 * 獲取月份
	 * 
	 * @return
	 */
	public static String getMonth() {
		SimpleDateFormat formatter;
		formatter = new SimpleDateFormat("M");
		String month = formatter.format(new Date());
		return month;
	}
	/**
	 * 獲取年
	 * 
	 * @return
	 */
	public static String getYear() {
		SimpleDateFormat formatter;
		formatter = new SimpleDateFormat("yyyy");
		String year = formatter.format(new Date());
		return year;
	}
	/**
	 * 對日期格式的轉換成("yyyy-MM-dd)格式的方法
	 * 
	 * @param str
	 * @return
	 */
	public static java.sql.Date Convert(String str) {
		SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd");
		try {
			java.util.Date d = sdf.parse(str);
			java.sql.Date d1 = new java.sql.Date(d.getTime());
			return d1;
		} catch (Exception ex) {
			ex.printStackTrace();
			return null;
		}
	}
	/**
	 * 獲取當前年、月、日:
	 * 
	 * @return
	 */
	public static int getYYMMDD() {
		Date date = new Date();
		int year = date.getYear() + 1900;// thisYear = 2003
		int month = date.getMonth() + 1;// thisMonth = 5
		int day = date.getDate();// thisDate = 30
		return year + month + day;
	}

	/**
	 * 取系統當前時間:返回值為如下形式 2002-10-30
	 * 
	 * @return String
	 */
	public static String getYYYY_MM_DD() {
		return getDateToString(new Date()).substring(0, 10);
	}

	/**
	 * 取系統給定時間:返回值為如下形式 2002-10-30
	 * 
	 * @return String
	 */
	public static String getYYYY_MM_DD(String date) {
		return date.substring(0, 10);
	}

	/**
	 * 在jsp頁面中的日期格式和sqlserver中的日期格式不一樣,怎樣統一? 
	 * 在頁面上顯示輸出時,用下面的函式處理一下
	 * 
	 * @param date
	 * @return
	 */
	public static String getFromateDate(Date date) {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
		String strDate = formatter.format(date);
		return strDate;
	}
	
	/**
	 * 獲取當前時間是本年的第幾周
	 * @return
	 */
	public static String getWeeK_OF_Year(){
		Calendar cal = Calendar.getInstance();
		Date date = new Date();
		cal.setTime(date);
		int week=cal.get(Calendar.WEEK_OF_YEAR );
		return  "當日是本年的第"+week+"周";
	}
	/**
	 * 獲取當日是本年的的第幾天
	 * @return
	 */
	public static String getDAY_OF_YEAR(){
		Calendar cal = Calendar.getInstance();
		Date date = new Date();
		cal.setTime(date);
		int day=cal.get(Calendar.DAY_OF_YEAR );
		return  "當日是本年的第"+day+"天";
	}
	/**
	 * 獲取本週是在本個月的第幾周
	 * @return
	 */
	public static String getDAY_OF_WEEK_IN_MONTH(){
		Calendar cal = Calendar.getInstance();
		Date date = new Date();
		cal.setTime(date);
		/*
		 * 這裡這個值可以完全看JDK裡面呼叫一下
		 * 或者點一下呼叫執行看看結果,看看裡面的
		 * English說明就知道它是幹嘛的
		 */
		int week=cal.get(Calendar.DAY_OF_WEEK_IN_MONTH);
		return  "本月第"+week+"周";
	}
	
	/**
	 *陽曆轉陰曆農曆:http://zuoming.iteye.com/blog/1554001
	 * GregorianCalendar使用: http://zmx.iteye.com/blog/409465
	 * GregorianCalendar 類提供處理日期的方法。
	 * 一個有用的方法是add().使用add()方法,你能夠增加象年
	 * 月數,天數到日期物件中。要使用add()方法,你必須提供要增加的欄位
	 * 要增加的數量。一些有用的欄位是DATE, MONTH, YEAR, 和 WEEK_OF_YEAR
	 * 下面的程式使用add()方法計算未來80天的一個日期.
	 * 在Jules的<環球80天>是一個重要的數字,使用這個程式可以計算
	 * Phileas Fogg從出發的那一天1872年10月2日後80天的日期:
	 */
	public static void getGregorianCalendarDate(){
		GregorianCalendar worldTour = new GregorianCalendar(1872, Calendar.OCTOBER, 2);
		worldTour.add(GregorianCalendar.DATE, 80);
		Date d = worldTour.getTime();
		DateFormat df = DateFormat.getDateInstance();
		String s = df.format(d);
		System.out.println("80 day trip will end " + s);
	}
	
	/**
	 * 用來處理時間轉換格式的方法
	 * @param formate
	 * @param time
	 * @return
	 */
	private static String getConvertDateFormat(String formate, Date time) {
		SimpleDateFormat dateFormat=new SimpleDateFormat(formate);
		String date=dateFormat.format(time);
		return date;
	}
	
	/**  
	 * 得到本月的第一天  
	 * @return  
	 */  
	public static String getCurrentMonthFirstDay() { 
	    Calendar calendar = Calendar.getInstance();   
	    calendar.set(Calendar.DAY_OF_MONTH, calendar   
	            .getActualMinimum(Calendar.DAY_OF_MONTH));   
	    return getConvertDateFormat("yyyy-MM-dd", calendar.getTime());   
	}   
	  
	/**  
	 * 得到本月的最後一天  
	 *   
	 * @return  
	 */  
	public static String getCurrentMonthLastDay() {   
	    Calendar calendar = Calendar.getInstance();   
	    calendar.set(Calendar.DAY_OF_MONTH, calendar   
	            .getActualMaximum(Calendar.DAY_OF_MONTH));   
	    return getConvertDateFormat("yyyy-MM-dd", calendar.getTime());   
	}   
	/**
	 * 
	 * 獲取上個月的第一天
	 * 
	 * @return
	 */
	public static String getBeforeMonthFirstDay() {
		Calendar cal = Calendar.getInstance();
		Date date = new Date();
		cal.setTime(date);
		int year = 0;
		int month = cal.get(Calendar.MONTH); // 上個月月份
		int day = cal.getActualMinimum(Calendar.DAY_OF_MONTH);//起始天數

		if (month == 0) {
			year = cal.get(Calendar.YEAR) - 1;
			month = 12;
		} else {
			year = cal.get(Calendar.YEAR);
		}
		String endDay = year + "-" + month + "-" + day;
		return endDay;
	}

	/**
	 * 獲取上個月的最一天
	 * 
	 * @return
	 */
	public static String getBeforeMonthLastDay() {
		//例項一個日曆單例物件
		Calendar cal = Calendar.getInstance();
		Date date = new Date();
		cal.setTime(date);
		int year = 0;
		int month = cal.get(Calendar.MONTH); // 上個月月份
		// int day1 = cal.getActualMinimum(Calendar.DAY_OF_MONTH);//起始天數
		int day = cal.getActualMaximum(Calendar.DAY_OF_MONTH); // 結束天數

		if (month == 0) {
			//year = cal.get(Calendar.YEAR) - 1;
			month = 12;
		} else {
			year = cal.get(Calendar.YEAR);
		}
		String endDay = year + "-" + month + "-" + day;
		return endDay;
	}
	
	/**
	 * 
	 * 獲取下月的第一天
	 * 
	 * @return
	 */
	public static String getNextMonthFirstDay() {
		Calendar cal = Calendar.getInstance();
		Date date = new Date();
		cal.setTime(date);
		int year = 0;
		int month = cal.get(Calendar.MONDAY)+2; // 下個月月份
		/*
		 * 如果是這樣的加一的話代表本月的第一天
		 * int month = cal.get(Calendar.MONDAY)+1; 
		 * int month = cal.get(Calendar.MONTH)+1
		 */
		int day = cal.getActualMinimum(Calendar.DAY_OF_MONTH);//起始天數

		if (month == 0) {
			year = cal.get(Calendar.YEAR) - 1;
			month = 12;
		} else {
			year = cal.get(Calendar.YEAR);
		}
		String Day = year + "-" + month + "-" + day;
		return Day;
	}

	/**
	 * 獲取下個月的最一天
	 * 
	 * @return
	 */
	public static String getNextMonthLastDay() {
		//例項一個日曆單例物件
		Calendar cal = Calendar.getInstance();
		Date date = new Date();
		cal.setTime(date);
		int year = 0;
		int month = cal.get(Calendar.MONDAY)+2; // 下個月份
		// int day1 = cal.getActualMinimum(Calendar.DAY_OF_MONTH);//起始天數
		int day = cal.getActualMaximum(Calendar.DAY_OF_MONTH); // 結束天數

		if (month == 0) {
			//year = cal.get(Calendar.YEAR) - 1;
			month = 12;
		} else {
			year = cal.get(Calendar.YEAR);
		}
		String endDay = year + "-" + month + "-" + day;
		return endDay;
	}

	/**
	 * 本地時區輸出當前日期 GMT時間
	 */
	public static String getLocalDate() {
		Date date = new Date();
		return date.toLocaleString();// date.toGMTString();
	}
	/**
	 * 判斷客戶端輸入的是閏年Leap還是平年Average
	 * @return
	 */
	public static String getLeapOrAverage (int year){
		
		if((year%4==0 && year%100!=0)||year%400==0){
			return year+"閏年";
		}else{
			return year+"平年";
		}
	}
	/**
	 * 測試
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		 
		System.out.println(new DateHelper().getWeeK_OF_Year());

	}
}