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");//開(kāi)始時(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");//開(kāi)始時(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(); } }
第三種:開(kāi)始結(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; } } } //得到開(kāi)始那一年已過(guò)去的日期 int starday=days(star1[0],star1[1],star1[2]); //得到結(jié)束那一年已過(guò)去的日期 int endday=days(end1[0],end1[1],end1[2]); //減去開(kāi)始那一年已過(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)文章
基于Zookeeper實(shí)現(xiàn)服務(wù)注冊(cè)和服務(wù)發(fā)現(xiàn)功能
無(wú)論是采用SOA還是微服務(wù)架構(gòu),都需要使用服務(wù)注冊(cè)和服務(wù)發(fā)現(xiàn)組件,本文將基于 Zookeeper 實(shí)現(xiàn)服務(wù)注冊(cè)和服務(wù)發(fā)現(xiàn)功能,如果跟我一樣有同樣的困惑,希望可以通過(guò)本文了解其他組件如何使用 Zookeeper 作為注冊(cè)中心的工作原理2023-09-09Java中LocalCache本地緩存實(shí)現(xiàn)代碼
本篇文章主要介紹了Java中LocalCache本地緩存實(shí)現(xiàn)代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05Java中使用websocket實(shí)現(xiàn)在線聊天功能
這篇文章主要介紹了Java中使用websocket實(shí)現(xiàn)在線聊天功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-02-02Hibernate延遲加載原理與實(shí)現(xiàn)方法
這篇文章主要介紹了Hibernate延遲加載原理與實(shí)現(xiàn)方法,較為詳細(xì)的分析了Hibernate延遲加載的概念,原理與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-03-03