java日期计算简析(Calendar类)

时间: 2012-06-16 / 分类: Java学习 / 浏览次数: 1,270 views / 2个评论 发表评论

今天主要学习的日期操作主要是—–获取日期字段(年、月、日、年中的天数、年中的周数等)、计算两个时间的间隔日期(年、月、天)、根据开始时间间隔时间计算结束时间。

关于Calendar日历的字段值,一些比较重要的如下:

常规的年月日时分秒:
static int YEAR
指示年的 get 和 set 的字段数字。
static int MONTH
指示月份的 get 和 set 的字段数字。
static int DATE
get 和 set 的字段数字,指示一个月中的某天。
static int HOUR
get 和 set 的字段数字,指示上午或下午的小时。
static int MINUTE
get 和 set 的字段数字,指示一小时中的分钟
static int SECOND
get 和 set 的字段数字,指示一分钟中的秒。

比较有用的几个字段:

static int DAY_OF_YEAR
get 和 set 的字段数字,指示当前年中的天数。
static int WEEK_OF_YEAR
get 和 set 的字段数字,指示当前年中的星期数。
static int WEEK_OF_MONTH
get 和 set 的字段数字,指示当前月中的星期数。
static int DAY_OF_WEEK
get 和 set 的字段数字,指示一个星期中的某天。

下面是关于日期计算的测试代码,虽然较长,但是调理很清晰。

/**
 * 日期类Date、Calendar测试类
 *
 */
package com.date_test;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * @author wkupaochuan
 * @time Jun 14, 2012
 * @version V 1.0
 *
 * 实现的接口如下:
 * 1---根据开始时间和间隔天数计算结束时间 Date calculateEndDate(Date sDate, int days)
 * 2---根据开始时间、结束时间、间隔类型(年、月、日)计算间隔时间 int calInterval(Date sDate, Date eDate, String type)
 * 3---输出日历实例(当前时间)的各个字段值 void printFields(Calendar cNow)
 * 4---判定某个年份是否是闰年 boolean isLeapYear(int year)
 * 5---比较两个日期的大小 int compareDate(Date sDate, Date eDate)
 */
public class Calendar_test {

	public static void main(String agrs[])
	{
		//获取日历实例并赋予当前时间
		Calendar cNow = Calendar.getInstance();
		cNow.setTime(new Date());
		//输出日历相关字段
		printFields(cNow);

		/*计算两个日期的时间间隔*/
		//开始时间
		Date sDate = new Date();
		//结束时间
		try {
			Date eDate = (new SimpleDateFormat("yyyy-MM-dd")).parse("2012-05-29");
			//计算结果并输出
			System.out.println("今天与2020-05-29相隔:" + calInterval(sDate, eDate, "d") + "天");
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		/*计算结束日期并输出*/
		SimpleDateFormat df = (SimpleDateFormat)DateFormat.getInstance();
		df.applyPattern("yyyy-MM-dd");
		System.out.println("从几天开始计算,2天后是:" + df.format(calculateEndDate(sDate, 2)));
	}

	/**
	 * 根据起始日期和间隔时间计算结束日期
	 *
	 * @param sDate开始时间
	 *
	 * @param days间隔时间
	 *
	 * @return 结束时间
	 * */
	public static Date calculateEndDate(Date sDate, int days)
	{
		//将开始时间赋给日历实例
		Calendar sCalendar = Calendar.getInstance();
		sCalendar.setTime(sDate);
		//计算结束时间
		sCalendar.add(Calendar.DATE, days);
		//返回Date类型结束时间
		return sCalendar.getTime();
	}

	/**
	 * 计算两个日期的时间间隔
	 *
	 * @param sDate开始时间
	 *
	 * @param eDate结束时间
	 *
	 * @param type间隔类型("Y/y"--年  "M/m"--月  "D/d"--日)
	 *
	 * @return interval时间间隔
	 * */
	private static int calInterval(Date sDate, Date eDate, String type)
	{
		//时间间隔,初始为0
		int interval = 0;

		/*比较两个日期的大小,如果开始日期更大,则交换两个日期*/
		//标志两个日期是否交换过
		boolean reversed = false;
		if(compareDate(sDate, eDate) > 0)
		{
			Date dTest = sDate;
			sDate = eDate;
			eDate = dTest;
			//修改交换标志
			reversed = true;
		}

		/*将两个日期赋给日历实例,并获取年、月、日相关字段值*/
		Calendar sCalendar = Calendar.getInstance();
		sCalendar.setTime(sDate);
		int sYears = sCalendar.get(Calendar.YEAR);
		int sMonths = sCalendar.get(Calendar.MONTH);
		int sDays = sCalendar.get(Calendar.DAY_OF_YEAR);

		Calendar eCalendar = Calendar.getInstance();
		eCalendar.setTime(eDate);
		int eYears = eCalendar.get(Calendar.YEAR);
		int eMonths = eCalendar.get(Calendar.MONTH);
		int eDays = eCalendar.get(Calendar.DAY_OF_YEAR);

		//年
		if(cTrim(type).equals("Y") || cTrim(type).equals("y"))
		{
			interval = eYears - sYears;
			if(eMonths < sMonths)
			{
				--interval;
			}
		}
		//月
		else if(cTrim(type).equals("M") || cTrim(type).equals("m"))
		{
			interval = 12 * (eYears - sYears);
			interval += (eMonths - sMonths);
		}
		//日
		else if(cTrim(type).equals("D") || cTrim(type).equals("d"))
		{
			interval = 365 * (eYears - sYears);
			interval += (eDays - sDays);
			//除去闰年天数
			while(sYears < eYears)
			{
				if(isLeapYear(sYears))
				{
					--interval;
				}
				++sYears;
			}
		}
		//如果开始日期更大,则返回负值
		if(reversed)
		{
			interval = -interval;
		}
		//返回计算结果
		return interval;
	}

	/**
	 * 输出日历相关字段(当前日期)
	 *
	 * @param cNow当前时间
	 *
	 * @return null
	 *
	 * 各个字段值都可以用get(field)得到,也可以用set(field, value)函数修改
	 * */
	 private static void printFields(Calendar cNow)
	{
		//先用Date类型输出验证
		SimpleDateFormat df = (SimpleDateFormat)DateFormat.getInstance();
		df.applyPattern("yyyy-MM-dd  HH:mm:ss");
		System.out.println("标准日期:" + df.format(new Date()));
		//逐个输出相关字段值
		System.out.print("年份:" + cNow.get(Calendar.YEAR) + "\t");
		//月份有问题(这里的月份开始计数为0)
		System.out.print("月份:" + cNow.get(Calendar.MONTH) + "\t");
		System.out.print("日期:" + cNow.get(Calendar.DATE) + "\t");
		System.out.print("小时:" + cNow.get(Calendar.HOUR) + "\t");
		System.out.print("分钟:" + cNow.get(Calendar.MINUTE) + "\t");
		System.out.println("秒钟:" + cNow.get(Calendar.SECOND));
		//本年的第几天,在计算时间间隔的时候有用
		System.out.println("一年中的天数:" + cNow.get(Calendar.DAY_OF_YEAR));
		System.out.println("一年中的周数:" + cNow.get(Calendar.WEEK_OF_YEAR));
		//即本月的第几周
		System.out.println("一月中的周数:" + cNow.get(Calendar.WEEK_OF_MONTH));
		//即一周中的第几天(这里是以周日为第一天的)
		System.out.println("一周中的天数:" + cNow.get(Calendar.DAY_OF_WEEK));
	}

	 /**
	  * 判定某个年份是否是闰年
	  *
	  * @param year待判定的年份
	  *
	  * @return 判定结果
	  * */
	 private static boolean isLeapYear(int year)
	 {
		 return (year%400 == 0 || (year%4 == 0 && year%100 != 0));
	 }

	/**
	*
	* 字符串去除两头空格,如果为空,则返回"",如果不空,则返回该字符串去掉前后空格
	*
	* @param tStr输入字符串
	*
	* @return 如果为空,则返回"",如果不空,则返回该字符串去掉前后空格
	*
	*/
	public static String cTrim(String tStr)
	{
		String ttStr = "";
		if (tStr == null)
		{}
		else
		{
			ttStr = tStr.trim();
		}
		return ttStr;
	}

	/**
	 * 比较两个Date类型的日期大小
	 *
	 * @param sDate开始时间
	 *
	 * @param eDate结束时间
	 *
	 * @return result返回结果(0--相同  1--前者大  2--后者大)
	 * */
	private static int compareDate(Date sDate, Date eDate)
	{
		int result = 0;
		//将开始时间赋给日历实例
		Calendar sC = Calendar.getInstance();
		sC.setTime(sDate);
		//将结束时间赋给日历实例
		Calendar eC = Calendar.getInstance();
		eC.setTime(eDate);
		//比较
		result = sC.compareTo(eC);
		//返回结果
		return result;
	}

}

程序执行结果如下:



.

*******************************************************************

上面是广告! 真的是广告!! 真的真的啊!!!

-----------------------------------------------------Copyright © 2011-2012--浙ICP备12011997---------------------------- ---------------------- ------------------------

无觅相关文章插件,快速提升流量