1. 程式人生 > >Java操作Date的工具類

Java操作Date的工具類

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map;
import java.util.TimeZone;

/**
 * 日期處理
 * 
 * @vesion 1.0
 */
public class DateUtil
{

	private final static String DATE_AND_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
	private final static String DATE_AND_TIME_MS_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";
	private final static String TIME_FORMAT = "HH:mm:ss";
	private final static String MM_DD_YYYY_FORMAT = "yyyy-MM-dd";
	private final static String DATE_WITHOUT_SEPARATOR_FORMAT = "yyyyMMdd";
	private final static String DATE_WITH_SEPARATOR_FORMAT = "yyyy-MM-dd";
	private final static String DATE_YEAR_AND_MONTH_WITH_SEPARATOR_FORMAT = "yyyy-MM";
	private final static String DATE_YEAR_AND_MONTH_WITH_CHINESE_FORMAT = "yyyy年MM月";
	private final static String DATETIME_WITHOUT_SEPARATOR_FORMAT = "yyyyMMddHHmmss";
	private final static String DATETIME_WITHOUT_SEPARATOR_FORMAT_SPACE = "yyyyMMdd HHmmss";
	private final static String MM_DD_AND_HH_MM = "MM月dd日 HH:mm";
	// 定義時間日期顯示格式

	private final static String DATE_FORMAT = "yyyy-MM-dd";

	/**
	 * 獲得timestamp型別的當前系統日期
	 * 
	 * @return
	 */
	public Timestamp getDateTime()
	{
		return new Timestamp(new Date().getTime());
	}

	/**
	 * 獲取當前系統日期前一日的日期
	 * 
	 * @desc
	 * @return
	 * @author yang.jianqi
	 * @date 2016-3-2 11:33:05
	 * @version 1.0
	 */
	public static Date getYesterDayStr()
	{
		Calendar cal = Calendar.getInstance();
		cal.add(Calendar.DAY_OF_YEAR, -1);
		return cal.getTime();
	}

	/**
	 * 把形如"2012-12-21";的字串轉換成時間
	 * 
	 * @desc
	 * @param mmDDYYYStr
	 * @return
	 * @author yang.shuai
	 * @date 2011-12-16 下午03:05:00
	 * @version 1.0
	 */
	public static Date getDateFromDateStr(String dateStr)
	{
		SimpleDateFormat insdf = new SimpleDateFormat(MM_DD_YYYY_FORMAT);
		try
		{
			if (dateStr == null || dateStr.trim().isEmpty())
			{
				return null;
			}
			return insdf.parse(dateStr);
		} catch (ParseException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 把形如"20121221";的字串轉換成時間
	 * 
	 * @desc
	 * @param mmDDYYYStr
	 * @return
	 * @author yang.jianqi
	 * @date 2016-3-2 10:31:44
	 * @version 1.0
	 */
	public static Date getDateWithoutSeparatorFromDateStr(String dateStr)
	{
		SimpleDateFormat insdf = new SimpleDateFormat(
				DATE_WITHOUT_SEPARATOR_FORMAT);
		try
		{
			if (dateStr == null || dateStr.trim().isEmpty())
			{
				return null;
			}
			return insdf.parse(dateStr);
		} catch (ParseException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 把形如"2012-02";的字串轉換成時間
	 * 
	 * @param dateStr
	 * @return
	 */
	public static Date getDateFromDateTimeYearMonthStr(String dateStr)
	{
		SimpleDateFormat insdf = new SimpleDateFormat(DATE_YEAR_AND_MONTH_WITH_SEPARATOR_FORMAT);
		try
		{
			if ((dateStr == null) || (dateStr.trim().isEmpty()))
			{
				return null;
			}
			return insdf.parse(dateStr);
		} catch (ParseException e)
		{
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 把形如"2012-12-21 10:24:30";的字串轉換成時間
	 * 
	 * @param dateStr
	 * @return
	 */
	public static Date getDateFromDateTimeStr(String dateStr)
	{
		SimpleDateFormat insdf = new SimpleDateFormat(DATE_AND_TIME_FORMAT);
		try
		{
			if ((dateStr == null) || (dateStr.trim().isEmpty()))
			{
				return null;
			}
			return insdf.parse(dateStr);
		} catch (ParseException e)
		{
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 把形如"20121221 102430";的字串轉換成時間
	 * 
	 * @param dateStr
	 * @return
	 */
	public static Date getDateFromDateTimeSpaceWithoutSeparator(String dateStr)
	{
		SimpleDateFormat insdf = new SimpleDateFormat(
				DATETIME_WITHOUT_SEPARATOR_FORMAT_SPACE);
		try
		{
			if ((dateStr == null) || (dateStr.trim().isEmpty()))
			{
				return null;
			}
			return insdf.parse(dateStr);
		} catch (ParseException e)
		{
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 把形如"20121221102430";的字串轉換成時間
	 * 
	 * @param dateStr
	 * @return
	 */
	public static Date getDateFromDateTimeWithoutSeparator(String dateStr)
	{
		SimpleDateFormat insdf = new SimpleDateFormat(
				DATETIME_WITHOUT_SEPARATOR_FORMAT);
		try
		{
			if ((dateStr == null) || (dateStr.trim().isEmpty()))
			{
				return null;
			}
			return insdf.parse(dateStr);
		} catch (ParseException e)
		{
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 根據引數獲得java.sql.Date型別 dateTime為需要轉換的日期引數,pattern為轉換格式。 方法呼叫:
	 * getDateTime("",Util.DEFAULT_DATE_PATTERN_All),則按預設時間格式輸出,格式如下
	 * <code>yyyy-MM-dd HH:mm:ss</code>
	 * 
	 * @param dateTime
	 * @param pattern
	 * @return java.sql.Date
	 */
	public static Date getDateTime(String dateTime, String pattern)
	{
		DateFormat dateFormat = getSimpleDateFormat(pattern);
		Date date = null;
		try
		{
			date = dateFormat.parse(dateTime);
		} catch (Exception e)
		{
			// e.printStackTrace();
			return null;
		}
		return date;
	}

	/**
	 * 根據引數獲得java.sql.Date型別 根據年、月、日引數和pattern指定的轉換格式,返回對應的日期字串。 方法呼叫:
	 * getDateTime(Util.DEFAULT_DATE_PATTERN_All,2010,6,10),則按預設時間格式輸出內容如下
	 * <code>2010-06-10 00:00:00</code>
	 * 
	 * @param pattern
	 * @param year
	 *            年
	 * @param month
	 *            月
	 * @param date
	 *            日
	 * @return java.sql.Date
	 */
	public static String getDateTime(String pattern, int year, int month,
			int date)
	{
		DateFormat df = getSimpleDateFormat(pattern);
		Calendar c = Calendar.getInstance();
		c.set(year, month - 1, date);
		return df.format(c.getTime());
	}

	/**
	 * 根據指定日期轉換格式獲得對應日期的時間字串
	 * 
	 * @param pattern
	 * @param dateTime
	 * @return String
	 */
	public String getDateTime(String pattern, Object dateTime)
	{
		return getSimpleDateFormat(pattern).format(dateTime);
	}

	/**
	 * 獲取Date型別的全字串表示格式 例子:d => yyyy-MM-dd HH:mm:ss
	 * 
	 * @desc
	 * @param d
	 * @return
	 * @author yang.shuai
	 * @date 2011-11-8 下午02:57:27
	 * @version 1.0
	 */
	public static String getDateTimeStr(Date d)
	{
		if (d == null)
		{
			return "";
		}
		final SimpleDateFormat insdf = new SimpleDateFormat(
				"yyyy-MM-dd HH:mm:ss");
		return insdf.format(d);
	}

	/**
	 * 獲取Date型別的全字串表示格式 例子:d => yyyy-MM-dd
	 * 
	 * @desc
	 * @param d
	 * @return
	 * @author yang.shuai
	 * @date 2011-11-8 下午02:57:27
	 * @version 1.0
	 */
	public static String getDateStr(Date d)
	{
		if (d == null)
		{
			return "";
		}
		final SimpleDateFormat insdf = new SimpleDateFormat("yyyy-MM-dd");
		return insdf.format(d);
	}

	/**
	 * 獲取String型別的全字串表示格式 例子:d => yyyy-MM-dd
	 * 
	 * @param d
	 * @return
	 */
	public static String getString2DateStr(String d)
	{
		Date date = null;

		if (d == null)
		{
			return "";
		} else
		{
			SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");// 小寫的mm表示的是分鐘
			try
			{
				date = sdf.parse(d);
			} catch (ParseException e)
			{
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		SimpleDateFormat insdf = new SimpleDateFormat("yyyy-MM-dd");
		return insdf.format(date);
	}

	/**
	 * 獲得 java.text.SimpleDateFormat
	 * 
	 * @param pattern
	 * @return
	 */
	public static SimpleDateFormat getSimpleDateFormat(String pattern)
	{
		return new SimpleDateFormat(pattern);
	}

	/**
	 * 獲得指定日期格式的指定日期時間範圍內的所有日期。
	 * 
	 * @param pattern
	 *            指定日期格式,若引數預設為Util.DEFAULT_DATE_PATTERN_YEAR_MONTH_DATE
	 * @param startdate
	 *            開始時間
	 * @param enddate
	 *            結束時間
	 * @return String[]
	 */
	public static String[] getHotelDate(String pattern, String startdate,
			String enddate)
	{
		SimpleDateFormat f = new SimpleDateFormat(pattern);
		try
		{
			Date d1 = f.parse(startdate);
			Date d2 = f.parse(enddate);
			long days = (d2.getTime() - d1.getTime()) / 3600000 / 24;
			Calendar startcal = Calendar.getInstance();
			Calendar endcal = Calendar.getInstance();
			startcal.setTime(d1);
			endcal.setTime(d2);
			String hotelDate[] = new String[(int) days + 1];
			hotelDate[0] = f.format(d1);
			int i = 1;
			while (endcal.after(startcal))
			{
				if (i <= days)
					startcal.add(Calendar.DATE, 1);
				hotelDate[i] = f.format(startcal.getTime());
				i++;
			}
			return hotelDate;
		} catch (ParseException e)
		{
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 獲得當前日期為每週的第幾天
	 * 
	 * @param pattern
	 * @param dateTime
	 * @return
	 */
	public static int getDayOfWeek(String pattern, String dateTime)
	{
		Date date = null;
		try
		{
			date = getSimpleDateFormat(pattern).parse(dateTime);
		} catch (ParseException e)
		{
			// logger.error("解析日期格式錯誤,錯誤資訊為:" + e.getMessage());
		}
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		int weekOfDay = calendar.get(Calendar.DAY_OF_WEEK);
		if (weekOfDay == 1)
		{
			weekOfDay = 7;
			return weekOfDay;
		}
		return weekOfDay - 1;
	}

	/**
	 * 根據引數,獲得幾天後的日期
	 * 
	 * @param pattern
	 *            日期解析型別
	 * @param dateTime
	 *            需要轉換的日期
	 * @return
	 */
	public Date getDateAfter(String pattern, Date dateTime)
	{
		int defaultDate = 7;
		Calendar now = Calendar.getInstance();
		now.setTime(dateTime);
		now.set(Calendar.DATE, now.get(Calendar.DATE) + defaultDate);
		return now.getTime();
	}

	/**
	 * 根據引數,獲得幾天前的日期
	 * 
	 * @param pattern
	 *            日期解析型別
	 * @param dateTime
	 *            需要轉換的日期
	 * @param defaultDate
	 *            天數
	 * @author zhu.yiming
	 * @date 2016-8-25 15:02:00
	 * @version 1.0
	 * @return
	 */
	public static Date getDateBefore(Date dateTime, int defaultDate)
	{

		Calendar now = Calendar.getInstance();
		now.setTime(dateTime);
		now.set(Calendar.DATE, now.get(Calendar.DATE) - defaultDate);
		return now.getTime();
	}

	/**
	 * 根據引數,獲得後幾天前的日期
	 * 
	 * @param pattern
	 *            日期解析型別
	 * @param dateTime
	 *            需要轉換的日期
	 * @param defaultDate
	 *            天數
	 * @author zhu.yiming
	 * @date 2016-8-25 15:02:00
	 * @version 1.0
	 * @return
	 */
	public static Date getDateAfter(Date dateTime, int defaultDate)
	{

		Calendar now = Calendar.getInstance();
		now.setTime(dateTime);
		now.set(Calendar.DATE, now.get(Calendar.DATE) + defaultDate);
		return now.getTime();
	}

	/**
	 * 根據當前系統時間獲取零點和二十四點的時間
	 * 
	 * @author zhu.yiming
	 * @date 2016-8-25 15:03:00
	 * @version 1.0
	 * @return
	 * @remark 對於20161026這樣格式的日期 zeroDate獲取到2016-10-25 00:00:00
	 */
	public static Map getZeroDateAndTwelveDate(long current)
	{

		long zero = current / (1000 * 3600 * 24) * (1000 * 3600 * 24)
				- TimeZone.getDefault().getRawOffset();// 今天零點零分零秒的毫秒數
		long twelve = zero + 24 * 60 * 60 * 1000 - 1;// 今天23點59分59秒的毫秒數

		Map<String, Date> dateMap = new HashMap<String, Date>();

		dateMap.put("zeroDate", new Date(zero));
		dateMap.put("twelveDate", new Date(twelve));

		return dateMap;
	}

	/**
	 * 獲得當前日期是每週的周幾
	 * 
	 * @return String
	 */
	public String getCurrentDayofWeek()
	{
		StringBuffer sb = new StringBuffer();
		DateFormat dateFormat = getSimpleDateFormat("yyyy-MM-dd");
		String dateTime = dateFormat.format(new Date());
		int sIndex = dateTime.indexOf("-");
		int eIndex = dateTime.lastIndexOf("-");
		String year = dateTime.substring(0, sIndex);
		String month = dateTime.substring(sIndex + 1, eIndex);
		String day = dateTime.substring(eIndex + 1, dateTime.length());
		sb.append("日期:");
		sb.append(year + "年");
		sb.append(month + "月");
		sb.append(day + "日");
		int temp = getDayOfWeek("yyyy-MM-dd", dateTime);
		if (temp == 0)
		{
			sb.append(" 週日");
		} else
		{
			switch (temp - 1)
			{
			case 1:
				sb.append(" 週一");
				break;
			case 2:
				sb.append(" 週二");
				break;
			case 3:
				sb.append(" 週三");
				break;
			case 4:
				sb.append(" 週四");
				break;
			case 5:
				sb.append(" 週五");
				break;
			case 6:
				sb.append(" 週六");
				break;
			default:
				break;
			}
		}
		return sb.toString();
	}

	/**
	 * 獲得當前日期周的週一
	 * 
	 * @return
	 */
	public String getCurrentMonday()
	{
		int mondayPlus = getMondayPlus();
		GregorianCalendar currentDate = new GregorianCalendar();
		currentDate.add(GregorianCalendar.DATE, mondayPlus);
		Date monday = currentDate.getTime();
		SimpleDateFormat dateFormat = new SimpleDateFormat(
				"yyyy-MM-dd HH:mm:ss");
		Date modayDate = null;
		try
		{
			modayDate = dateFormat.parse(dateFormat.format(monday));
		} catch (ParseException e)
		{
			// logger.error("解析日期格式錯誤,錯誤資訊為:" + e.getMessage());
		}
		return dateFormat.format(modayDate);
	}

	/**
	 * 獲得當前日期與本週一相差的天數
	 * 
	 * @return
	 */
	private int getMondayPlus()
	{
		Calendar cd = Calendar.getInstance();
		int dayOfWeek = cd.get(Calendar.DAY_OF_WEEK);
		if (dayOfWeek == 1)
		{
			return -6;
		} else
		{
			return 2 - dayOfWeek;
		}
	}

	/**
	 * 得到格式化後的時間,格式為yyyy-MM-dd HH:mm:ss,如2006-02-15 15:23:45
	 * 
	 * @param currDate
	 *            要格式化的時間
	 * @see #getFormatDateTime(java.util.Date, String)
	 * @return String 返回格式化後的時間,預設格式為yyyy-MM-dd HH:mm:ss,如2006-02-15 15:23:45
	 * @author jiang.hao
	 */
	public static String getFormatDateTime(java.util.Date currDate)
	{
		return getFormatDate(currDate, DATE_AND_TIME_FORMAT);
	}

	/**
	 * 得到格式化後的時間,格式為yyyy-MM-dd HH:mm:ss.SSS,如2006-02-15 15:23:45.000
	 * 
	 * @param currDate
	 *            要格式化的時間
	 * @see #getFormatDateTime(java.util.Date, String)
	 * @return String 返回格式化後的時間,預設格式為yyyy-MM-dd HH:mm:ss.SSS,如2006-02-15
	 *         15:23:45.000
	 * @author yang.jianqi
	 */
	public static String getMSFormatDateTime(java.util.Date currDate)
	{
		return getFormatDate(currDate, DATE_AND_TIME_MS_FORMAT);
	}

	public static String getFormatTime(java.util.Date date)
	{
		return getFormatDate(date, TIME_FORMAT);
	}

	public static String getDateWithoutSeparator(java.util.Date date)
	{
		return getFormatDate(date, DATE_WITHOUT_SEPARATOR_FORMAT);
	}

	public static String getDateWithSeparator(java.util.Date date)
	{
		return getFormatDate(date, DATE_WITH_SEPARATOR_FORMAT);
	}

	public static String getDateYearAndMonthWithSeparator(java.util.Date date)
	{
		return getFormatDate(date, DATE_YEAR_AND_MONTH_WITH_SEPARATOR_FORMAT);
	}
	
	/**
	 * 返回yyyy年MM月格式的字串
	 * @param date
	 * @return
	 */
	public static String getDateYearAndMonthWithChineseSeparator(java.util.Date date)
	{
		return getFormatDate(date, DATE_YEAR_AND_MONTH_WITH_CHINESE_FORMAT);
	}

	public static String getDateTimeWithoutSeparator(java.util.Date date)
	{
		return getFormatDate(date, DATETIME_WITHOUT_SEPARATOR_FORMAT);
	}

	/**
	 * 根據格式得到格式化後的日期
	 * 
	 * @param currDate
	 *            要格式化的日期
	 * @param format
	 *            日期格式,如yyyy-MM-dd
	 * @see java.text.SimpleDateFormat#format(java.util.Date)
	 * @return String 返回格式化後的日期,格式由引數<code>format</code>
	 *         定義,如yyyy-MM-dd,如2006-02-15
	 */
	public static String getFormatDate(java.util.Date currDate, String format)
	{
		if (currDate == null)
		{
			return "";
		}
		SimpleDateFormat dtFormatdB = null;
		try
		{
			dtFormatdB = new SimpleDateFormat(format);
			return dtFormatdB.format(currDate);
		} catch (Exception e)
		{
			dtFormatdB = new SimpleDateFormat(DATE_FORMAT);
			try
			{
				return dtFormatdB.format(currDate);
			} catch (Exception ex)
			{
			}
		}
		return null;
	}

	/**
	 * 獲得當前日期的該月第一天日期
	 */
	@SuppressWarnings("deprecation")
	public static String getFirstDate(String datetime, String formate)
	{
		datetime = getDateTimeStr(getDateTime(datetime, DATE_FORMAT));
		String month = datetime.substring(5, 7);
		System.out.println(month);
		return datetime.substring(0, 8) + "01";
	}

	/**
	 * 獲取月份的最後一天
	 * 
	 * @param dateTime
	 * @return
	 */
	public static String getLastDate(String dateTime)
	{
		String lastday = null;

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Calendar cale = Calendar.getInstance();
		try
		{
			cale.setTime(sdf.parse(dateTime));
			cale.add(Calendar.MONTH, 1);
			cale.set(Calendar.DAY_OF_MONTH, 0);
			lastday = sdf.format(cale.getTime());
		} catch (ParseException e1)
		{
			// TODO Auto-generated catch block
			e1.printStackTrace();
			return null;
		}
		return lastday;
	}
	
	/**
	 * 得到格式化後的時間,格式為MM月dd日 HH:mm,如02月15日 15:23
	 * 
	 * @param currDate
	 *            要格式化的時間
	 * @see #getFormatDateTime(java.util.Date, String)
	 * @return String 返回格式化後的時間,預設格式為MM月dd日 HH:mm,如02月15日 15:23
	 * @author jiang.hao
	 */
	public static String getFormatTradeDateTime(java.util.Date currDate)
	{
		return getFormatDate(currDate, MM_DD_AND_HH_MM);
	}

	/**
	 * 獲取該時間的前幾個月
	 * 
	 * @param dateTime
	 * @param defaultMonth
	 * @return
	 */
	public static Date getDateBeforeByMonth(Date dateTime, int defaultMonth)
	{

		Calendar c = Calendar.getInstance();
		c.setTime(dateTime);
		c.add(Calendar.MONTH, - defaultMonth);
		return c.getTime();
	}
	
	/**
	 * 獲取該時間的後幾個月
	 * 
	 * @param dateTime
	 * @param defaultMonth
	 * @return
	 */
	public static Date getDateAfterByMonth(Date dateTime, int defaultMonth)
	{

		Calendar c = Calendar.getInstance();
		c.setTime(dateTime);
		c.add(Calendar.MONTH, defaultMonth);
		return c.getTime();
	}
	
	/**
	 * 獲取年份
	 * 
	 * @param dateTime
	 * @return
	 */
	public static int getYear(Date dateTime)
	{
		Calendar c = Calendar.getInstance();
		c.setTime(dateTime);
		return c.get(Calendar.YEAR);
	}
	
	/**
	 * 獲取月份(第幾月)
	 * 
	 * @param dateTime
	 * @return
	 */
	public static int getMonth(Date dateTime)
	{
		Calendar c = Calendar.getInstance();
		c.setTime(dateTime);
		return c.get(Calendar.MONTH) + 1;
	}
	
	/**
	 * 獲取季度(第幾季度)
	 *  
	 * @param dateTime
	 * @return
	 */
	public static int getQuarter(Date dateTime)
	{
		int month = getMonth(dateTime);
		return (month -1 + 3)/3;
	}
	
	public static void main(String[] args)
	{
		long current = System.currentTimeMillis();// 當前時間毫秒數
		long zero = current / (1000 * 3600 * 24) * (1000 * 3600 * 24)
				- TimeZone.getDefault().getRawOffset();// 今天零點零分零秒的毫秒數
		long twelve = zero + 24 * 60 * 60 * 1000;// 今天23點59分59秒的毫秒數
		System.out.println(getFirstDate("2012-02-06", "yyyy-MM-dd"));
		System.out.println(new Date(zero));// 今天零點零分零秒
		System.out.println(new Date(twelve));// 今天23點59分59秒
		System.out.println(getDateBefore(new Date(), 30));
		System.out.println(getDateFromDateTimeWithoutSeparator("20170627205549"));
	}
}