`
cjf068
  • 浏览: 34400 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

日期计算

 
阅读更多
简单日期计算类:
日期大小比较
日期之间天数计算
package org.jf.alg;


/**
 * 
 * @author junfeng.chen
 *
 */
public class Date {

	private int year;
	private int month;
	private int day;
	
	private static final int days_array[]= {31,28,31,30,31,30,31,31,30,31,30,31};
	private static final int days_leap_array[]= {31,29,31,30,31,30,31,31,30,31,30,31};
	private static final String  MONTH_NAME[] = {"January","Febuary", "March",  "April", "May", "June", "July",   "August",  "September", "October","November","December"};   
	private static final String WEEK_NAME[] = {"Monday","Tuesday", "Wednesday","Thursday", "Friday","Saturday","Sunday"}; 
    
	public Date(int year,int month,int day)
	{
		this.year = year;
		boolean leap = Date.isLeapYear(this.year);
		this.month = month;
		if(this.month%12==0)
			this.month = 12;
		else this.month = this.month%12;
		if(leap)
		{
			this.day = day%days_leap_array[this.month-1]==0?days_leap_array[this.month-1]:day%days_leap_array[this.month-1];//day<=days_leap_array[this.month-1]?day:days_leap_array[this.month-1];
		}else
		{
			this.day = day%days_array[this.month-1]==0?days_array[this.month-1]:day%days_array[this.month-1];
		}
	}
	
	public Date()
	{
		this.year = 1970;
		this.month = 1;
		this.day =1;
	}

	public int getYear() {
		return year;
	}

	public void setYear(int year) {
		this.year = year;
	}

	public int getMonth() {
		return month;
	}

	public void setMonth(int month) {
		
		this.month = month;

		boolean leap = Date.isLeapYear(this.year);
		if(this.month%12==0)
			this.month = 12;
		else this.month = this.month%12;
		
		//check day
		if(leap)
		{
			this.day = day%days_leap_array[this.month-1]==0?days_leap_array[this.month-1]:day%days_leap_array[this.month-1];//day<=days_leap_array[this.month-1]?day:days_leap_array[this.month-1];
		}else
		{
			this.day = day%days_array[this.month-1]==0?days_array[this.month-1]:day%days_array[this.month-1];
		}
	}

	public int getDay() {
		return day;
	}

	/**
	 * date filed set seq --> year month day
	 * you should granted that year filed and month filed have set
	 * @param day
	 */
	public void setDay(int day) {
		
		this.day = day;
		
		boolean isleap = isLeapYear(year);
		if(isleap)
		{
			this.day = day%days_leap_array[this.month-1]==0?days_leap_array[this.month-1]:day%days_leap_array[this.month-1];//day<=days_leap_array[this.month-1]?day:days_leap_array[this.month-1];
		}else
		{
			this.day = day%days_array[this.month-1]==0?days_array[this.month-1]:day%days_array[this.month-1];
		}
		
		
	}
	
	
	public Date addDay(int days)
	{
		if(days > 0)
		{
			//上补齐为本月末一天
			int thismonthday = this.monthDays(this.month,isLeapYear(this));
			int d = thismonthday - this.day;
			if(days>=d)
			{
				this.day = thismonthday;
				days = days - d;
			}
			else
			{
				this.day+=days;
				days = 0;
			}
			
			while(days > 0)
			{
				int nextmonth = this.month+1;
				int nextyear = this.year;
				if(nextmonth>12)
				{
					nextmonth = 1;
					nextyear += 1;
				}
				boolean ran = isLeapYear(nextyear);
				int nextmonthday = this.monthDays(nextmonth,ran);
				if(days>=nextmonthday)
				{
					this.month = nextmonth;
					this.year = nextyear;
					days -= nextmonthday;
					this.day = nextmonthday;

				}else
				{
					this.month = nextmonth;
					this.day = days;
					days = 0;

				}
			}
		}else
		{			
			days*=-1;
			//下补齐为上月最后一天(如果可能)
			if(this.day<=days)
			{
				days -= this.day;
				int pre_year = this.year;
				int pre_month =this.month-1;
				if(pre_month == 0)
				{
					pre_month = 12;
					pre_year -- ;
				}
				int pre_month_day = monthDays(pre_month,isLeapYear(pre_year));
				this.year = pre_year;
				this.month = pre_month;
				this.day = pre_month_day;
			}else
			{
				
				this.day -= days;
				days = 0;
			}
			
			
			//按月递减
			while(days>0)
			{
				int pre_month = this.month - 1;
				int pre_year = year;
				if(pre_month==0)
				{
					pre_month = 12;
			    	pre_year = year -1;
				}
				int pre_month_day = this.monthDays(pre_month, isLeapYear(pre_year));
				
				if(days>=this.day)
				{
					days -= this.day;
					this.year = pre_year;
					this.month = pre_month;
					this.day = pre_month_day;
					
				}else
				{
					this.day -= days;
					days = 0;
				}
			}
			
		}
		
		return this;
	}
	
	
	/**
	 * 
	 * @param months
	 * @return
	 */
	public Date addMonth(int months)
	{
		int addYear = months/12;
		int addMonth = months%12;
		
		
		if(months>0)
		{
			this.year += addYear;
			this.month += addMonth;
			
			if(this.month>12)
			{
				this.year ++;
				this.month = this.month - 12;
			}
		
		}else
		{
			this.year +=addYear;
			if(this.month+addMonth<=0)
			{
				this.year --;
				this.month = 12 + this.month+addMonth;
			}else
			{
				this.month += addMonth;
			}
		}
		
		
		boolean isleap = isLeapYear(year);
		if(isleap)
		{
			if(day>Date.days_leap_array[month-1])
				day = Date.days_leap_array[month-1];
		}
		else 
		{
			if(day>Date.days_array[month-1])
				day = Date.days_array[month-1];
		}
		
		return this;
	}
	
	
	public Date addYear(int year)
	{
		this.year +=year;
		boolean leap = Date.isLeapYear(this.year);
		if(leap)
		{
			if(this.day > Date.days_leap_array[this.month-1])
				this.day = Date.days_leap_array[this.month-1];
		}else
		{
			if(this.day > Date.days_array[this.month-1])
				this.day = Date.days_array[this.month-1];
		}
		
		return this;
	}
	
	
	@Deprecated
	public static int daysBetween(Date date1,Date date2)
	{
		return date1.days() - date2.days();
	}
	
	public String weekDay()
	{
		int week_num = (day + 2*month + 3*(month+1)/5 + year + year/4 - year/100 + year/400) % 7;   

		return Date.WEEK_NAME[week_num];
	}
	
	public int dateDiff(Date date)
	{
		int nd , nm , ny; //new_day, new_month, new_year   
	    int od , om , oy ; //old_day, oldmonth, old_year   
		
		 nm = (date.month + 9) % 12;   
		 ny = date.year - nm/10;   
	     nd = 365*ny + ny/4 - ny/100 + ny/400 + (nm*306 + 5)/10 + (date.day - 1);   
    
		 om = (month + 9) % 12;   
		 oy = year - om/10;   
		 od = 365*oy + oy/4 - oy/100 + oy/400 + (om*306 + 5)/10 + (day - 1);   

		 return od - nd;
	}
	
	public int cmp(Date date)
	{
		if (this.year > date.year)
			return 1;
		else if (this.year == date.year) {
			if (this.month > date.month)
				return 1;
			else if (this.month == date.month) {
				if (this.day > date.day)
					return 1;
				else if (this.day == date.day)
					return 0;
//				return -1;
			}
//			return -1;
		}

		return -1;
		
			
	}
	
	public static boolean isLeapYear(int year)
	{
		return (year%4==0&&year%100!=0) || year%400 == 0;
	}
	
	public static boolean isLeapYear(Date date)
	{
		return (date.year%4==0&&date.year%100!=0) || date.year % 400 == 0 ;
	}
	
	private int monthDays(int month,boolean run)
	{
		if(run)
			return days_leap_array[month-1];
		return days_array[month-1];
	}
	
	public String toString()
	{
		return this.year+"-"+this.month+"-"+this.day;
	}
	
	int days()
	{
		int year = this.year;
		int month = this.month;
		int day = this.day;
		int days = 0;
		days += day;
		month --;
		if(month==0)
		{
			month = 12;
			year --;
		}
		int monthday = this.monthDays(month, isLeapYear(year));
		
		while(year>0)
		{
			days+=monthday;
			month --;
			if(month==0)
			{
				month = 12;
				year --;
			}
			monthday = this.monthDays(month, isLeapYear(year));
		}
		return days;
	}
	
	
}
分享到:
评论

相关推荐

    根据经纬度和日期计算日出日落时间

    在IT领域,根据经纬度和日期计算日出日落时间是一项常见的地理信息处理任务,它涉及到天文学、地球物理学和编程技术。这个程序的核心是利用天文学公式来预测太阳在地平线上的位置,从而确定一天中的日出和日落时刻。...

    模仿iphone(wheelView)实现日期算出年龄和星座

    在Android开发中,为了提供与iOS类似的用户体验,开发者...这个项目展示了如何结合使用自定义View、日期计算和星座判断来实现这一功能。理解和实现这样的功能有助于提升Android开发者在UI设计和用户交互方面的技能。

    S7-200SMART_日期计算(天数)库文件及使用说明.rar

    标题中的"S7-200SMART_日期计算(天数)库文件及使用说明"指的是一个专门针对西门子S7-200SMART系列PLC的编程资源,该资源包含了一个用于处理日期和时间计算的库函数,特别是计算两个日期之间相差的天数。...

    SQL Server各种日期计算方法

    ### SQL Server中的日期计算方法详解 在SQL Server中进行日期计算是数据库操作中常见的需求之一。本文将深入探讨SQL Server中处理日期的各种方法,并通过具体的示例来展示这些方法的实际应用。 #### 1. DATEADD 和...

    根据日期计算星期几的C语言代码

    在C语言中,实现根据日期计算星期几的功能是常见且实用的编程需求。本文将详细解析一段C语言代码,该代码能够根据输入的年、月、日计算出对应的星期几。 ### 核心知识点 #### C语言中的日期处理 C语言标准库并未...

    C语言:日期计算算法优化:两个日期求间隔,按天数往后计算日期,按天数往前计算日期

    个人在进行C语言复习期间编写的一个进行日期计算的程序(算法优化),主要功能有:选择菜单,两个日期求间隔,按天数往后计算日期,按天数往前计算日期,功能循环。主要用了函数,指针,结构体等知识

    delphi 通过日期计算年龄

    假设我们已经有了一个 `TDate` 类型的变量 `BirthDate` 存储了用户的出生日期,我们可以使用 `Now` 函数获取当前日期,并用这两个日期进行计算。 计算年龄的基本步骤如下: 1. 获取当前日期:`CurrentDate := Now;...

    java根据日期计算年龄和星期

    ### Java根据日期计算年龄与星期知识点详解 #### 一、概述 在Java中处理日期时,经常需要根据特定的日期来计算出年龄或者确定该日期是星期几。这对于开发涉及日期处理的应用程序非常实用。本文将详细介绍如何使用...

    Labview 日期时间标识间隔计算天数或小时数,指定加长日期计算

    本教程将详细讲解如何在Labview中进行日期时间间隔的计算,包括计算天数和小时数,以及如何在给定日期基础上增加指定的天数。 首先,我们需要理解Labview中的日期和时间数据类型。在Labview中,日期和时间通常以...

    日期计算程序(java)

    在编程领域,日期计算是一个常见的任务,特别是在处理与时间有关的应用中。本项目"日期计算程序(java)"提供了一个简单的Java小程序,旨在帮助用户计算两日期之间的天数差异,例如计算自己的年龄或者任何两个有意义...

    C语言前一天日期计算

    根据给定的文件信息,我们可以总结出以下关于“C语言前一天日期计算”的详细知识点: ### 一、程序目的 该程序的主要目的是计算任意指定日期的前一天。用户输入一个具体的年月日,程序会验证这些输入是否合法...

    日期计算的控制台程序

    FYDATE.EXE - 日期计算工具 [2008 Forever Young] &lt;br&gt;使用帮助: ======================================================= &lt;br&gt;/? or /H - 显示帮助信息。 &lt;br&gt;/T:[+ | -]x - 计算日期 + 增加 - ...

    C#根据日期计算星期几,根据月份计算天数

    本教程将深入探讨如何根据日期计算星期几以及如何根据月份计算天数。这些功能在日历应用、报表生成、数据分析等场景中非常实用。 首先,我们需要了解C#中的`DateTime`结构。`DateTime`是.NET框架提供的一个类型,...

    js日期计算

    ### JS日期计算:掌握日期操作的艺术 在JavaScript中,日期计算是前端开发中常见的需求之一,无论是处理用户界面中的日期选择、数据统计还是时区转换,掌握日期对象及其方法都是必不可少的技能。本文将深入探讨如何...

    SAP 订单的交货日期的计算.

    ### SAP 订单交货日期计算详解 #### 一、引言 在现代供应链管理中,准确预测和控制交货日期对于提升客户满意度至关重要。本文旨在深入探讨SAP系统中订单交货日期的计算逻辑及其背后的配置方法。我们将通过理论与...

    日历计算 施工日期计算

    在建筑工程领域,施工日期计算是一项至关重要的任务,它涉及到项目的进度管理、资源调度以及合同履行等多个方面。"日历计算 施工日期计算" 主要关注如何准确地从施工开始日期推算出竣工日期,这涉及到一系列的时间...

    日期计算、倒计时、天数计算

    日期计算、倒计时以及天数计算是编程领域中常见的功能需求,特别是在日历应用、项目管理、事件提醒等场景中。以下将详细介绍这些概念及其在实际应用中的实现方法。 日期计算涉及到对日期的加减操作,比如计算两个...

    SQL Server各种日期计算

    在探讨SQL Server中进行日期计算的方法之前,我们必须了解SQL Server中处理日期和时间的基本函数:DATEDIFF和DATEADD。这两个函数在实际应用中非常常用,可以帮助我们得到两个日期间的时间间隔以及通过已知时间间隔...

    java指定日期计算一年内第几天和给出一年内第几天算出指定日期

    java指定日期计算一年内第几天和给出一年内第几天算出指定日期 【指定日期换算成第几天】 2019年10月31日是一年内的第:304天 【一年的第几天换算对应日期】 2019年的第304天 对应的日期是2019-10-31

Global site tag (gtag.js) - Google Analytics