经常有机试题目要求求出两个日期之间的相差的天数
参考链接java计算两个日期之间相差的天数的四种方法_dashenmepi的博客-CSDN博客_java计算两个日期相差多少天
暴力做法(不推荐)
如果把给定的yyyyMMdd日期拆分为年、月、日,然后分情况讨论,会很麻烦
但思路简单,很容易推理得到,缺点就是有很多选哟注意的小细节,考试浪费时间
首先计算两个年份之间的差距
按照年份差距>0,=0和<0分类计算
然后对于年份,还需要有判断平年闰年的方法,平年二月28天,闰年2月31天
平闰年判断方法
闰年(leap year)可以被400整除,或者可以被4整除,但不能被100整除
boolean isLeapYear(int y){
if ((y % 100 != 0 && y % 4 == 0) || y % 400 == 0){
return true;
}
return false;
}
闰年比如有2016年,可被4整除,但不能被100整除
2000年就属于可以被400整除的闰年
思路就是先计算两个时间点年份的差距,比如2016年到2019年,2016+2017+2018三年全部天数+2019已经过去的天数-2016已经过去的天数
package May04;
import java.util.Scanner;
public class fu20190104 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
String str=in.next();
int year=Integer.parseInt(str.substring(0,4));
int month=Integer.parseInt(str.substring(4,6));
int date=Integer.parseInt(str.substring(6));
int start=(year>2019)?2019:year;
int end=(year<2019)?2019:year;
int days=0;
for(int i=start;i<end;i++)
{
if((i%4==0&&i%100!=0)||(i%400==0))
{
days+=366;
}
else {
days+=365;
}
}
if(start==2019) {
int enddate=calculate(year,month,date);
int startdate=calculate(2019, 2, 5);
days=days-startdate+enddate;
}
else{
int startdate=calculate(year,month,date);
int enddate=calculate(2019, 2, 5);
days=days-startdate+enddate;
}
System.out.println(days);
}
public static int calculate(int i, int month, int date) {
// TODO Auto-generated method stub
int days=0;
int[] months=new int[] {0,31,28,31,30,31,30,31,31,30,31,30,31};
if((i%4==0&&i%100!=0)||(i%400==0))
{
months[2]=29;
}
else {
months[2]=28;
}
for(int j=1;j<month;j++)
{
days+=months[j];
}
days+=date;
return days;
}
}
时间戳
计算两天的时间戳的差,再除以一天的毫秒数,得到的就是相差的天数
package May04;
import java.net.Socket;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class fu20190102 {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
String str=in.next();
DateFormat dft=new SimpleDateFormat("yyyyMMdd");
try {
Date start=dft.parse("20190205");
Date end=dft.parse(str);
Long startTime=start.getTime();
Long endTime=end.getTime();
Long gap=endTime-startTime;
long dis=Math.abs(gap/(24*60*60*1000));
System.out.println(dis);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
顺便拓展一下DateFormat、SimpleDateFormat和Date
DateFormat dft=new SimpleDateFormat("yyyyMMdd");
这个公式用来格式化日期, yyyy表示年,MM表示月,dd表示日
dft.formatter(Date)作用是按照指定的格式,把Date日期转化为符合模式的字符串。
dft.parse(String)作用是将文本转化为日期
Calendar类可以读取Date类的年月日,方法如下:
Calendar calendar=Calendar.getInstance();
calendar.setTime(date);
//获取年
System.out.println(calendar.get(Calendar.YEAR));
需要注意的是它这个月是从0开始计算的
Calender类
试用util包的Calendar类,每次增加一天,直到和结束时间相等的时候。
package May04;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;
public class fu20190103 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
String str=in.next();
DateFormat dft=new SimpleDateFormat("yyyyMMdd");
try {
Date start=dft.parse("20190205");
Date end=dft.parse(str);
Date nexDate=start;
int num=0;
while (nexDate.before(end)) {
Calendar calendar=Calendar.getInstance();
calendar.setTime(nexDate);
//表示的意思就是日期+1
calendar.add(Calendar.DATE, 1);
nexDate=calendar.getTime();
num++;
}
System.out.println(num);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}