Java计算两个具体日期相差的天数

来源:互联网 发布:投资软件靠谱吗 编辑:程序博客网 时间:2024/05/16 03:10
package com.yjl.nianfendemo;
public class NianFen {
//三个私有属性,年月日
private int year;
private int month;
private int day;
//无参构造
public NianFen(){

}
//有参构造.
public NianFen(int year,int month,int day){
this.setYear(year);
this.setMonth(month);
this.setDay(day);
}
//设置年份
public void setYear(int year){
this.year=year;
}
//设置月份
public void setMonth(int month){
if(month>12||month<1){
this.month=0;
}else{
this.month=month;
}
}
//设置日期
public void setDay(int day){
if(day>31||day<1){
this.day=0;
}else{
this.day=day;
}
}
//得到年份
public int getYear(){
return this.year;
}
//得到月份
public int getMonth(){
return this.month;
}
//得到日期
public int getDay(){
return this.day;
}
//得到返回信息
public String toString(){
return this.getYear()+"年"+
this.getMonth()+"月"+this.getDay()+"日";
}
//判断是否是闰年
public boolean isYear(){
//能够被4整除,但是不能被100整除,或者能够直接被400整除.
if((this.year%4==0&&this.year%100!=0)||
this.year%400==0){
return true;
}
return false;
}
//得到平年的月份的天数
public int getPingMonthDay(){
int num=0;
switch(this.month){
case 1:{
num=0;break;
}
case 2:{
num=31;break;
}
case 3:{
num=31+28;break;
}
case 4:{
num=31+28+31;break;
}
case 5:{
num=31+28+31+30;break;
}
case 6:{
num=31+28+31+30+31;break;
}
case 7:{
num=31+28+31+30+31+30;break;
}
case 8:{
num=31+28+31+30+31+30+31;break;
}
case 9:{
num=31+28+31+30+31+30+31+31;break;
}
case 10:{
num=31+28+31+30+31+30+31+31+30;break;
}
case 11:{
num=31+28+31+30+31+30+31+31+30+31;break;
}
case 12:{
num=31+28+31+30+31+30+31+31+30+31+30;break;
}
default:{
num=0;break;
}
}
return num;
}
//得到闰年的月份天数.
public int getRunMonthDay(){
int num=0;
//将1月和2月单独拿出来,后面的直接加1便可。
if(this.month==1){
num=0;
}else if(this.month==2){
num=31;
}else{
num=this.getPingMonthDay()+1;
}
return num;
}
//得到年份的天数,距离1年1月1日的天数。
public int getYearDay(){
int yearNum=0;
//先得到1到year-1即年份上一年的平年天数。
yearNum=(this.year-1)*365;
//看有几个闰年天数,得到总天数。
for(int i=1;i<this.year;i++){
//将this.year设置为i.
this.setYear(i);
if(this.isYear()){
yearNum++;
}
}
return yearNum;
}
//得到总的天数。
public int getSocalDay(){
int socalNum=0;
//分闰年和平年,为年天数+月天数+日天数。
if(this.isYear()){
socalNum=this.getYearDay()+
this.getRunMonthDay()+this.day;
}else{
socalNum=this.getYearDay()+
this.getPingMonthDay()+this.day;
}
return socalNum;
}
//得到差值,参数为第二个对象,为自已方法内比较。
public int getSubNum(NianFen nf){
int subNum=0;
//如果地址相同,则对象完全相同,返回值为1.
if(this==nf){
return 0;
}
//如果参数nf为null,没有比较的意义,返回为空.
if(nf==null){
return 0;
}
//计算差值,取绝对值,前面的可能比后面的小。
subNum=Math.abs(this.getSocalDay()-
nf.getSocalDay());
return subNum;
}


}

--------------------测试类

package com.yjl.nianfendemo;
import java.util.*;
public class TestNianFen {
public static void main(String[] args) {
System.out.println("**********欢迎来到计算年份差值的程序***********");
Scanner scan=new Scanner(System.in);
boolean flag=true;//定义一个标志位.
String str1="",str2="";
while (flag) {
System.out.println("请输入最终日期,格式是yyyy-MM-dd,回车结束");
// 实例化Scanner输入流。键盘输入数字。
str1 = scan.nextLine();
if (str1.matches("\\d{4}-\\d{1,2}-\\d{1,2}")) {
System.out.println("输入年份格式正确");
// 退出循环.
flag = false;
} else {
System.out.println("输入年份错误,请重新输入");
flag = true;
}
}
while (!flag) {
System.out.println("请输入初始日期,格式是yyyy-MM-dd,回车结束");
str2 = scan.nextLine();
if (str2.matches("\\d{4}-\\d{1,2}-\\d{1,2}")) {
System.out.println("输入年份格式正确");
flag=true;
} else {
System.out.println("输入年份错误,请重新输入");
flag=false;
}
}
//定义一个数组,长度为3,得到数据。
int a[]=strToInt(str1);
//进行实例化结束年份.
NianFen nfEnd=new NianFen(a[0],a[1],a[2]);
//改变引用
a=strToInt(str2);
//实例化初始年份.
NianFen nfStart=new NianFen(a[0],a[1],a[2]);
//输出信息.
System.out.println(nfEnd.toString()+"距离"+
nfStart.toString()+"有"+nfEnd.getSubNum(nfStart)+"天");
scan.close();
}
//将输入的字符串转换为相应的数字。
public static int[] strToInt(String str){
//将字符串按照-进行拆分成字符串数组
String sArray[]=str.split("\\-");
//定义一个整型数组,进行接收。
int a[]=new int[sArray.length];
for(int i=0;i<sArray.length;i++){
//将字符串转换为数字.Integer.parseInt();
a[i]=Integer.parseInt(sArray[i]);
}
return a;
}
}