日期计算

简单日期计算类:
日期大小比较
日期之间天数计算

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;
}


}
Stkcd [股票代码] ShortName [股票简称] Accper [统计截止日期] Typrep [报表类型编码] Indcd [行业代码] Indnme [行业名称] Source [公告来源] F060101B [净利润现金净含量] F060101C [净利润现金净含量TTM] F060201B [营业收入现金含量] F060201C [营业收入现金含量TTM] F060301B [营业收入现金净含量] F060301C [营业收入现金净含量TTM] F060401B [营业利润现金净含量] F060401C [营业利润现金净含量TTM] F060901B [筹资活动债权人现金净流量] F060901C [筹资活动债权人现金净流量TTM] F061001B [筹资活动股东现金净流量] F061001C [筹资活动股东现金净流量TTM] F061201B [折旧摊销] F061201C [折旧摊销TTM] F061301B [公司现金流1] F061302B [公司现金流2] F061301C [公司现金流TTM1] F061302C [公司现金流TTM2] F061401B [股权现金流1] F061402B [股权现金流2] F061401C [股权现金流TTM1] F061402C [股权现金流TTM2] F061501B [公司自由现金流(原有)] F061601B [股权自由现金流(原有)] F061701B [全部现金回收率] F061801B [营运指数] F061901B [资本支出与折旧摊销比] F062001B [现金适合比率] F062101B [现金再投资比率] F062201B [现金满足投资比率] F062301B [股权自由现金流] F062401B [企业自由现金流] Indcd1 [行业代码1] Indnme1 [行业名称1] 季度数据,所有沪深北上市公司的 分别包含excel、dta数据文件格式及其说明,便于不同软件工具对数据的分析应用 数据来源:基于上市公司年报及公告数据整理,或相关证券交易所、各部委、省、市数据 数据范围:基于沪深北证上市公司 A股(主板、中小企业板、创业板、科创板等)数据整理计算
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值