Java 之 Date 和 Calendar 实例

package com.homer.learn;

import java.text.DateFormat;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;


public class TimeTest {
	public static void main(String[] args) {
		TimeTest tt = new TimeTest();

		System.out.println("\n当前日期: ");
		System.out.println(tt.getNowTime());					// 获取当前时间
		System.out.println(tt.getNowTime2());					// 获取当前时间
		System.out.println(tt.getNowTime3());					// 获取当前时间
		
		System.out.println("\n计算周: ");
		System.out.println(tt.getDaysOfNow2SundayInWeek());		// 获取当前日期与本周日的相差天数
		System.out.println(tt.getDateOfMondayInWeek());			// 获取本周一的日期
		System.out.println(tt.getDateOfSaturdayInWeek());		// 获取本周六的日期
		System.out.println(tt.getDateOfSaturdayInNextWeek());	// 获取下周一的日期
		System.out.println(tt.getDateOfSaturdayInLastWeek());	// 获取上周一的日期


		System.out.println("\n计算月: ");
		System.out.println(tt.getFirstDayOfMonth());			// 获取当月的第一天
		System.out.println(tt.getLastDayOfMonth());				// 获取当月最后一天
		System.out.println(tt.getFirstDayOfPreviousMonth());	// 获取上月第一天		
		System.out.println(tt.getLastDayOfPreviousMonth());		// 获取上月最后一天			
		System.out.println(tt.getFirstDayOfNextMonth());		// 获取下月第一天	
		System.out.println(tt.getLastDayOfNextMonth());			// 获取下月最后一天
		

		System.out.println("\n计算年: ");
		System.out.println(tt.getFirstDayOfYear());				// 获取本年的第一天
		System.out.println(tt.getLastDayOfYear());				// 获取本年最后一天
		System.out.println(tt.getFirstDayOfPreviousYear());		// 获取上年的第一天
		System.out.println(tt.getLastDayOfPreviousYear());		// 获取上年最后一天
		System.out.println(tt.getFirstDayOfNextYear());			// 获取下年的第一天
		System.out.println(tt.getLastDayOfNextYear());			// 获取下年最后一天
		System.out.println(tt.getDaysOfYear());					// 获取本年的天数
		

		System.out.println("\n计算季度: ");
		System.out.println(tt.getSeasonOfMonth());			 	// 获取当前月的季度
		System.out.println(tt.getLastDayOfNow());				// 获取当前天所在月份的天数
		System.out.println(tt.isLeapYear(2012));			 	// 判断是否是润年
		

		System.out.println("\n日期格式转换与计算: ");
		System.out.println(tt.getDateFromStr("2012-06-20"));	// 将字符串时间格式 yyyy-MM-dd,转换成Date类型
		System.out.println(tt.getWeek("2012-06-20"));			// 根据一个日期,返回是星期几的字符串
		System.out.print("2012-06-02 -> 2012-06-12间隔天数:");	// 计算两个日期间的间隔天数
		System.out.println(tt.getDaysFromTwoDate("2012-06-02", "2012-06-12"));			
	}

	
	
	// 获取当前时间
	public String getNowTime() {
		SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd");
		
		Date now = new Date();
		return sDateFormat.format(now);
	}

	public String getNowTime2() {
		SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		
		Date now = new Date(System.currentTimeMillis());
		return sDateFormat.format(now);
	}

	public String getNowTime3() {
		StringBuilder strBuildNow = new StringBuilder();
		
		Calendar calendar = Calendar.getInstance();
		int year = calendar.get(Calendar.YEAR);
		int month = calendar.get(Calendar.MONTH) + 1;
		int day = calendar.get(Calendar.DAY_OF_MONTH);
		int hour = calendar.get(Calendar.HOUR_OF_DAY);
		int minute = calendar.get(Calendar.MINUTE);
		int second = calendar.get(Calendar.SECOND);
		int millissecond = calendar.get(Calendar.MILLISECOND);
		
		strBuildNow.append(year + "-");
		strBuildNow.append(month + "-");
		strBuildNow.append(day + " ");
		strBuildNow.append(hour + ":");
		strBuildNow.append(minute + ":");
		strBuildNow.append(second + ".");
		strBuildNow.append(millissecond);
		
		return strBuildNow.toString();
	}
	
	
	
	
	// 获取当前日期与本周日的相差天数
	public int getDaysOfNow2SundayInWeek() {
		Calendar calendar = Calendar.getInstance();
		
		int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;		// 减一天,周一为1,符合中国人习惯。Sunday - 1; Monday - 2; Saturday - 7
		if(dayOfWeek == 0) {		// 周日
			return 0;
		} else {
			return 0 - dayOfWeek;
		}
	}
	
	// 获取本周一的日期
	public String getDateOfMondayInWeek(){
		int day = this.getDaysOfNow2SundayInWeek() + 1;	// 加1,即周一离本周日的间隔天数
		GregorianCalendar gCalendar = new GregorianCalendar();
		
		gCalendar.add(GregorianCalendar.DATE, day);		// 计算与本周一相差的时间间隔
		Date curDay = gCalendar.getTime();
		
		DateFormat dateFormat = DateFormat.getInstance();
		String dateOfMonday = dateFormat.format(curDay);
		
		return dateOfMonday;
	}

	// 获取本周六的日期
	public String getDateOfSaturdayInWeek(){
		int day = this.getDaysOfNow2SundayInWeek() + 6;	// 加6,即周六离本周日的间隔天数
		GregorianCalendar gCalendar = new GregorianCalendar();
		
		gCalendar.add(GregorianCalendar.DATE, day);		// 计算与本周六相差的时间间隔
		Date curDay = gCalendar.getTime();
		
		DateFormat dateFormat = DateFormat.getInstance();
		String dateOfMonday = dateFormat.format(curDay);
		
		return dateOfMonday;
	}

	// 获取上周一的日期
	public String getDateOfSaturdayInLastWeek(){
		int day = this.getDaysOfNow2SundayInWeek() - 1;	// 减1,即上周一离本周日的间隔天数
		GregorianCalendar gCalendar = new GregorianCalendar();
		
		gCalendar.add(GregorianCalendar.DATE, day);		// 计算与上周一相差的时间间隔
		Date curDay = gCalendar.getTime();
		
		DateFormat dateFormat = DateFormat.getInstance();
		String dateOfMonday = dateFormat.format(curDay);
		
		return dateOfMonday;
	}
	
	// 获取下周一的日期
	public String getDateOfSaturdayInNextWeek(){
		int day = this.getDaysOfNow2SundayInWeek() + 8;	// 加8,即下周一离本周日的间隔天数
		GregorianCalendar gCalendar = new GregorianCalendar();
		
		gCalendar.add(GregorianCalendar.DATE, day);		// 计算与下周一相差的时间间隔
		Date curDay = gCalendar.getTime();
		
		DateFormat dateFormat = DateFormat.getInstance();
		String dateOfMonday = dateFormat.format(curDay);
		
		return dateOfMonday;
	}
	
	
	

	// 获取当月第一天
	public String getFirstDayOfMonth() {
		String strFirstDay = "";
		SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd");
		
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.DATE, 1);		// 设置当前月的1号
		
		strFirstDay = sDateFormat.format(calendar.getTime());
		return strFirstDay;
	}

	// 获取当月最后一天
	public String getLastDayOfMonth() {
		String strLastDay = "";
		SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd");
		
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.DATE, 1);		// 设置当前月的1号
		calendar.add(Calendar.MONDAY, 1);	// 加一个月,变为下月的1号
		calendar.add(Calendar.DATE, -1);	// 减去一天,变为当前月的最后一天
		
		strLastDay = sDateFormat.format(calendar.getTime());
		return strLastDay;
	}

	// 获取上月第一天
	public String getFirstDayOfPreviousMonth() {
		String strFirstDay = "";
		SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd");
		
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.DATE, 1);		// 设置当前月的1号
		calendar.add(Calendar.MONDAY, -1);	// 减一个月,变为上月的1号
		
		strFirstDay = sDateFormat.format(calendar.getTime());
		return strFirstDay;
	}

	// 获取上月最后一天
	public String getLastDayOfPreviousMonth() {
		String strLastDay = "";
		SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd");
		
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.DATE, 1);		// 设置当前月的1号
		calendar.add(Calendar.DATE, -1);	// 减一天,变为上月的1号
		
		strLastDay = sDateFormat.format(calendar.getTime());
		return strLastDay;
	}

	public String getLastDayOfPreviousMonth2() {
		String strLastDay = "";
		SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd");
		
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.MONDAY, -1);	// 减一个月
		calendar.set(Calendar.DATE, 1);		// 设置当前月的1号
		calendar.roll(Calendar.DATE, -1);	// 把日期回滚一天,也就是本月最后一天
		
		strLastDay = sDateFormat.format(calendar.getTime());
		return strLastDay;
	}
	
	// 获取下月第一天
	public String getFirstDayOfNextMonth() {
		String strFirstDay = "";
		SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd");
		
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.MONTH, 1);	// 加一个月
		calendar.set(Calendar.DATE, 1);		// 设置当前月第一天
		
		strFirstDay = sDateFormat.format(calendar.getTime());
		return strFirstDay;
	}

	// 获取下月最后一天
	public String getLastDayOfNextMonth() {
		String strLastDay = "";
		SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd");
		
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.DATE, 1);		// 设置当前月的1号
		calendar.add(Calendar.MONDAY, 2);	// 加两个月,变为下下月的1号
		calendar.add(Calendar.DATE, -1);	// 减一天,变为下月的最后一天
		
		strLastDay = sDateFormat.format(calendar.getTime());
		return strLastDay;
	}

	public String getLastDayOfNextMonth2(){
		String strLastDay = "";
		SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd");
		
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.MONTH, 1);	// 加1个月
		calendar.set(Calendar.DATE, 1);		// 把日期设置为当月第1天
		calendar.roll(Calendar.DATE, -1);	// 日期回滚1天,也就是本月最后1天
		
		strLastDay = sDateFormat.format(calendar.getTime());
		return strLastDay;
	}
	
	
	
	
	// 获取本年的第一天
	public String getFirstDayOfYear(){
		String strFirstDay = "";
		SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd");
		
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.DAY_OF_YEAR, 1);		// 设置当年第一天
		
		strFirstDay = sDateFormat.format(calendar.getTime());
		return strFirstDay;
	}

	// 获取本年的最后一天
	public String getLastDayOfYear(){
		String strLastDay = "";
		
		Calendar calendar = Calendar.getInstance();
		strLastDay = calendar.get(Calendar.YEAR) + "-12-31";
		
		return strLastDay;
	}
	
	// 获取上年的第一天
	public String getFirstDayOfPreviousYear(){
		String strFirstDay = "";
		
		Calendar calendar = Calendar.getInstance();
		strFirstDay = (calendar.get(Calendar.YEAR) - 1) + "-01-01";
		
		return strFirstDay;
	}

	// 获取上年的最后一天
	public String getLastDayOfPreviousYear(){
		String strLastDay = "";
		
		Calendar calendar = Calendar.getInstance();
		strLastDay = (calendar.get(Calendar.YEAR) - 1) + "-12-31";
		
		return strLastDay;
	}
	
	// 获取下年的第一天
	public String getFirstDayOfNextYear(){
		String strFirstDay = "";
		SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd");
		
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.YEAR, 1);				// 加一年
		calendar.set(Calendar.DAY_OF_YEAR, 1);		// 设置当年第一天
		
		strFirstDay = sDateFormat.format(calendar.getTime());
		return strFirstDay;
	}

	// 获取下年的最后一天
	public String getLastDayOfNextYear(){
		String strLastDay = "";
		SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd");
		
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.YEAR, 1);				// 加一年
		calendar.set(Calendar.DAY_OF_YEAR, 1);		// 设置当年第一天
		calendar.roll(Calendar.DAY_OF_YEAR, -1);	// 回滚到当年最后一天
		
		strLastDay = sDateFormat.format(calendar.getTime());
		return strLastDay;
	}
	
	// 获取本年的天数
	public String getDaysOfYear(){
		int year = 0;
		int days = 0;
		
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.DAY_OF_YEAR, 1);		// 设置日期为当年第一天
		calendar.roll(Calendar.DAY_OF_YEAR, -1);	// 把日期回滚一天
		
		year = calendar.get(Calendar.YEAR);
		days = calendar.get(Calendar.DAY_OF_YEAR);
		
		return (days + " in " + year);
	}
	
	
	
	
	// 获取当前月的季度
	public String getSeasonOfMonth(){
		String strSeason = "";
		int year, month, day;
		int season = 1;
		int array[][] = new int[][]{ {1,2,3}, {4,5,6}, {7,8,9}, {10,11,12} };
		
		Calendar calendar = Calendar.getInstance();
		year = calendar.get(Calendar.YEAR);
		month = calendar.get(Calendar.MONDAY) + 1;
		day = calendar.get(Calendar.DAY_OF_MONTH);
		switch (month) {
		case 1:
		case 2:
		case 3:
			season = 1;
			break;
		case 4:
		case 5:
		case 6:
			season = 2;
			break;
		case 7:
		case 8:
		case 9:
			season = 3;
			break;
		case 10:
		case 11:
		case 12:
			season = 4;
			break;
		default:
			season = 1;
			break;
		}
		
		
		int start_month = array[season-1][0];
		int end_month = array[season-1][2];
		strSeason = year + "-" + month + "-" +day;
		strSeason += " in [ " + year + "-" + start_month + " : " + year + "-" + end_month + " ]";
		
		return strSeason;
	}
	
	
	// 获取当前天所在月份的天数
	public String getLastDayOfNow(){
		String strLastDay = "";
		int year, month, day;
		int days = 0;
		
		Calendar calendar = Calendar.getInstance();
		year = calendar.get(Calendar.YEAR);
		month = calendar.get(Calendar.MONTH) + 1;
		day = calendar.get(Calendar.DAY_OF_MONTH);
		
		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;
			}
			break;
		default:
			days = 0;
			break;
		}
		
		strLastDay = days + " in [ " + year + "-" + month + "-" + day + " ]";
		return strLastDay;
	}
	
	// 判断是否是润年
	public boolean isLeapYear(int year){
		return (year%4 == 0 && year%100 != 0) || (year%400 == 0);
	}
	
	
	
	

	// 将字符串时间格式 yyyy-MM-dd,转换成Date类型
	public Date getDateFromStr(String txtDate) {
		SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd");
		ParsePosition pos = new ParsePosition(0);
		Date date = sDateFormat.parse(txtDate, pos);
		
		return date;
	}

	// 根据一个日期,返回是星期几的字符串
	public String getWeek(String txtDate) {
		Date date = getDateFromStr(txtDate);
		Calendar calendar = Calendar.getInstance();
		
		calendar.setTime(date);
		String week = new SimpleDateFormat("EEEE").format(date);
		
		return week;
	}

	// 计算两个日期间的间隔天数
	public long getDaysFromTwoDate(String txtDate1, String txtDate2) {
		if(txtDate1 == null || txtDate1.equals("")) {
			return 0;
		}
		if(txtDate2 == null || txtDate2.equals("")) {
			return 0;
		}
		
		SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd");
		long days = 0;
		try {
			Date date1 = sDateFormat.parse(txtDate1);
			Date date2 = sDateFormat.parse(txtDate2);
			days = (date2.getTime() - date1.getTime())/(24*60*60*1000);		// 通过getTime()方法,把时间Date转换成毫秒格式Long类型,进行计算
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		
		return days;
	}
	
}


运行结果:


当前日期:

2012-03-07

2012-03-07 12:30:11

2012-3-7 12:30:11.101

计算周:

-3

3/5/12 12:30 PM

3/10/12 12:30 PM

3/12/12 12:30 PM

3/3/12 12:30 PM

计算月:

2012-03-01

2012-03-31

2012-02-01

2012-02-29

2012-04-01

2012-04-30

计算年:

2012-01-01

2012-12-31

2011-01-01

2011-12-31

2013-01-01

2013-12-31

366 in 2012

计算季度:

2012-3-7 in [ 2012-1 : 2012-3 ]

31 in [ 2012-3-7 ]

true

日期格式转换与计算:

Wed Jun 20 00:00:00 CST 2012

Wednesday

2012-06-02 -> 2012-06-12间隔天数:10



源码下载



参考推荐:


Java 之 Date 和 Calendar


java 已知一个Date(),获取前一天和后一天