java計(jì)算兩個(gè)日期之間相差天數(shù)的4種方法詳解
計(jì)算兩個(gè)日期之間相差的天數(shù)的四種方法
第一種:時(shí)間戳的方式,計(jì)算兩個(gè)日期的時(shí)間戳的差,再除當(dāng)天的毫秒數(shù)即可得到相差的天數(shù)。
public static void main(String[] args) {
DateFormat dft = new SimpleDateFormat("yyyy-MM-dd");
try {
Date star = dft.parse("2020-02-03");//開始時(shí)間
Date endDay=dft.parse("2025-03-02");//結(jié)束時(shí)間
Long starTime=star.getTime();
Long endTime=endDay.getTime();
Long num=endTime-starTime;//時(shí)間戳相差的毫秒數(shù)
System.out.println("相差天數(shù)為:"+num/24/60/60/1000);//除以一天的毫秒數(shù)
} catch (ParseException e) {
e.printStackTrace();
}
}第二種:試用util包的Calendar類,每次增加一天,知道和結(jié)束時(shí)間相等的時(shí)候。
public static void main(String[] args) {
DateFormat dft = new SimpleDateFormat("yyyy-MM-dd");
try {
Date star = dft.parse("2020-02-03");//開始時(shí)間
Date endDay=dft.parse("2025-03-02");//結(jié)束時(shí)間
Date nextDay=star;
int i=0;
while(nextDay.before(endDay)){//當(dāng)明天不在結(jié)束時(shí)間之前是終止循環(huán)
Calendar cld = Calendar.getInstance();
cld.setTime(star);
cld.add(Calendar.DATE, 1);
star = cld.getTime();
//獲得下一天日期字符串
nextDay = star;
i++;
}
System.out.println("相差天數(shù)為:"+i);
} catch (ParseException e) {
e.printStackTrace();
}
}第三種:開始結(jié)束時(shí)間拆分為年月日,循環(huán)計(jì)算每年的天數(shù)和月日的天數(shù),邏輯相加減。
public static void main(String[] args) {
String star="2020-02-03";
String end="2025-03-02";
String[] star1=star.split("-");
String[] end1=end.split("-");
int days=0;
if(Integer.parseInt(star1[0])<Integer.parseInt(end1[0])){
for(int i=Integer.parseInt(star1[0]);i<Integer.parseInt(end1[0]);i++){
//計(jì)算是否是瑞年
if(i%4==0&&i%100!=0||i%400==0){
days+=366;
}else{
days+=365;
}
}
}
//得到開始那一年已過(guò)去的日期
int starday=days(star1[0],star1[1],star1[2]);
//得到結(jié)束那一年已過(guò)去的日期
int endday=days(end1[0],end1[1],end1[2]);
//減去開始那一年已過(guò)去的日期,加上結(jié)束那一年已過(guò)去的日期
days=days-starday+endday;
System.out.println("相差的天數(shù):"+days);
}
public static int days(String year,String month,String day){
int days=0;
int nowyear=Integer.parseInt(year);
int[] monthday={0,31,28,31,30,31,30,31,31,30,31,30,31};
int[] monthday1={0,31,29,31,30,31,30,31,31,30,31,30,31};
boolean flag=true;
if(nowyear%4==0&&nowyear%100!=0||nowyear%400==0){
}else{
flag=false;
}
for(int i=0;i<Integer.parseInt(month);i++){
if(flag){
days+=monthday1[i];
}else{
days+=monthday[i];
}
}
days+=Integer.parseInt(day);
return days;
}第四種:以類的方式,計(jì)算給定日期到0001-01-01的總天數(shù),再以兩個(gè)日期的天數(shù)作差得到相差天數(shù)。
int y;
int m;
int d;
public test2(int y,int m,int d ){
this.y=y;
this.m=m;
this.d=d;
}
public int sum(test2 d){
int day=0;
int[] x={0,31,28,31,30,31,30,31,31,30,31,30,31};
for(int i=1;i<d.y;i++){
if(i%4==0&& i%100!=0 || i%400==0){
day+=366;
}else{
day+=365;
}
}
if(d.y%4==0&& d.y%100!=0 || d.y%400==0){
x[2]=29;
}
for(int i=1;i<d.m;i++){
day+=x[i];
}
day+=d.d;
System.out.println(day);
return day;
}
public int DiffDays(test2 d){//計(jì)算兩個(gè)日期之間的相距天數(shù)的成員方法
int s1=sum(this);
int s2=sum(d);
if(s1>s2){
return s1-s2;
}else{
return s2-s1;
}
}
public static void main(String args[]){
int a,b,c;
test2 d1,d2;
try{
d1=new test2(2020,02,03);
d2=new test2(2025,03,02);
System.out.println("相差的天數(shù):"+d1.DiffDays(d2));
}catch(Exception e){
System.out.println("error");
}
}總結(jié)
到此這篇關(guān)于java計(jì)算兩個(gè)日期之間相差天數(shù)的4種方法的文章就介紹到這了,更多相關(guān)java計(jì)算日期之間相差天數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Socket類以及ServerSocket類的實(shí)例講解
下面小編就為大家?guī)?lái)一篇基于Socket類以及ServerSocket類的實(shí)例講解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
spring boot攔截器的使用場(chǎng)景示例詳解
這篇文章主要給大家介紹了關(guān)于spring boot攔截器的使用場(chǎng)景,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
mybatis向數(shù)據(jù)庫(kù)里插入記錄后自動(dòng)返回記錄ID問題
本文介紹了在接手項(xiàng)目時(shí),對(duì)一個(gè)業(yè)務(wù)處理邏輯進(jìn)行重構(gòu)和性能優(yōu)化的經(jīng)歷,作者提到,性能問題可能是導(dǎo)致bug的一個(gè)重要原因,作者提到,在以前的.NET項(xiàng)目中,插入記錄后系統(tǒng)會(huì)自動(dòng)刷新實(shí)體類,為其中的主鍵ID賦值,而SpringBoot項(xiàng)目mybatis也可以通過(guò)指定主鍵來(lái)優(yōu)化代碼2025-01-01
MyBatis自定義映射關(guān)系和關(guān)聯(lián)查詢實(shí)現(xiàn)方法詳解
這篇文章主要介紹了MyBatis自定義映射關(guān)系和關(guān)聯(lián)查詢實(shí)現(xiàn)方法,當(dāng)POJO屬性名與數(shù)據(jù)庫(kù)列名不一致時(shí),需要自定義實(shí)體類和結(jié)果集的映射關(guān)系,在MyBatis注解開發(fā)中,使用@Results定義并使用自定義映射,使用 @ResultMap使用自定義映射2023-04-04
Java超詳細(xì)分析講解final關(guān)鍵字的用法
關(guān)于final關(guān)鍵字,它也是我們一個(gè)經(jīng)常用的關(guān)鍵字,可以修飾在類上、或者修飾在變量、方法上,以此看來(lái)定義它的一些不可變性!像我們經(jīng)常使用的String類中,它便是final來(lái)修飾的類,并且它的字符數(shù)組也是被final所修飾的。但是一些final的一些細(xì)節(jié)你真的了解過(guò)嗎2022-06-06
解析使用jdbc,hibernate處理clob/blob字段的詳解
本篇是對(duì)使用jdbc,hibernate處理clob/blob字段進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
Java實(shí)現(xiàn)按比抽獎(jiǎng)功能
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)按比抽獎(jiǎng)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-01-01
idea2023遠(yuǎn)程調(diào)試springboot的過(guò)程詳解
這篇文章主要介紹了idea2023遠(yuǎn)程調(diào)試,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08
Java 靜態(tài)綁定與動(dòng)態(tài)綁定深入分析
這篇文章主要介紹了Java 靜態(tài)綁定與動(dòng)態(tài)綁定深入分析的相關(guān)資料,這里對(duì)java 的動(dòng)態(tài)綁定和靜態(tài)綁定做了詳細(xì)的介紹,對(duì)其進(jìn)行總結(jié)整理,需要的朋友可以參考下2016-11-11
MyBatis實(shí)戰(zhàn)之動(dòng)態(tài)生成SQL詳解
這篇文章主要為大家詳細(xì)介紹了如何使用MyBatis實(shí)現(xiàn)動(dòng)態(tài)生成SQL,可以告別硬編碼,擁抱智能SQL生成,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-07-07

