关于日期问题(java)

计算两个日期之间的相差的天数

题目描述

有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。

输入

有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD

输出

每组数据输出一行,即日期差值

样例输入

20130101
20130105

样例输出

5

使用系统函数

代码

import java.util.Date;
import java.util.Scanner;

public class Main {
	
	
	public static void main(String[] args) throws ParseException {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		int time1=sc.nextInt();
		int time2=sc.nextInt();
		if(time1<time2) {
			int temp=time2;
			time2=time1;
			time1=temp;
		}
		int y1=time1/10000;int m1=time1%10000/100;int d1=time1%100;
		int y2=time2/10000;int m2=time2%10000/100;int d2=time2%100;
		Date date1=new Date(y1,m1,d1);
		Date date2=new Date(y2,m2,d2);
		long days=(date1.getTime()-date2.getTime())/(3600*24);
		System.out.println(days);
	}

}

自定义函数

  1. 假设输入的time1大于time2,如果time2更大,则将time1和time2的数值交换
  2. 循环累加y2,直至y1-y2>1,且每次累加前根据y是闰年还是平年增加366或者365
  3. 累加d2直至两个日期相同,同时累加累计天数的计数器ans
  4. 累加d2的同时,判断是否是当月的天数+1,如果是d2计为1,m++。需要注意的是在累加时,要根据年份y2来判定2月是28天还是29天。

代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	
	static int time1;
	static int time2;
	static int days[]= {-1,31,28,31,30,31,30,31,31,30,31,30,31};
	static boolean isLeapYear(int y) {
		return y%400==0||y%100!=0&&y%4==0;
	}
	static void read() throws IOException {
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		time1=Integer.parseInt(br.readLine());
		time2=Integer.parseInt(br.readLine());
	}
	static int ans=0;
	static void countDays() {
		if(time1<time2) {
			int temp=time2;
			time2=time1;
			time1=temp;
		}
		int y1=time1/10000;int m1=time1%10000/100;int d1=time1%100;
		int y2=time2/10000;int m2=time2%10000/100;int d2=time2%100;
		while(y1-y2>1) {
			if(isLeapYear(y2)) {
				ans+=366;
			}else ans+=365;
			y2++;
		}
		while(!(y1==y2&&d1==d2&&m1==m2)) {
			d2++;
			ans++;
			if(isLeapYear(y2)) {
				days[2]=29;
			}
			if(d2==days[m2]+1) {
				m2++;
				d2=1;
			}
			if(m2==13) {
				y2++;
				m2=1;
			}
		}
		System.out.println(ans);
	}
	
	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		read();
		countDays();
	}

}

星期问题

输入格式

输入三个正整数,分别表示年、月、日。保证输入年份合法。

输出格式

输出星期几。
用 Monday 、 Tuesday 、 Wednesday 、 Thursday 、 Friday 、 Saturday 、 Sunday
表示星期几。

样例输入1

1 1 1

样例输出1

Monday

样例输入2

2016 11 29

样例输出2

Tuesday

思想

先定义变量年份y,月份m,日期d,星期用ans计数
根据样例输入可知1 年1 月1 日为礼拜一
所以先设置y=1,m=1,d=1,ans=0,先对年份进行累加,如果是闰年ans+=366%7,如果是平年ans+=365%7;最后为了避免ans超出6所以对ans%=7;
再依次对月份和天数累加,直至日期相等。

代码

import java.util.*;

class Main {

	static String[] weekday = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
   
    static int whatday(int y, int m, int d) {
         // 返回正确的星期。用 0 - 6 表示 星期 1 - 7
   	int ans=0;
   	
       for(int i=1;i<y;i++){
           	if(i%4==0&&i%100!=0||i%400==0){
                ans+=366%7;
                ans%=7;
            }else{
				ans+=365%7;
                ans%=7;
            }
       }
       
        
        int []days={31,0,31,30,31,30,31,31,30,31,30,31};
        days[1]=y%4==0&&y%100!=0?29:28;
        for(int i=0;i<m-1;i++){
        	ans+=days[i]%7;
            ans%=7;
        }
        ans+=(d-1)%7;
        return ans%7;
    }
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        int y = cin.nextInt();
        int m = cin.nextInt();
        int d = cin.nextInt();
        System.out.println(weekday[whatday(y, m, d)]);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值