日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java 日期只计算年月日大小_Java按自然月计算两个日期相差的年月日?

發布時間:2025/3/17 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 日期只计算年月日大小_Java按自然月计算两个日期相差的年月日? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

曾經我以為計算兩個日期之差很簡單,在給我的團隊成員分配任務時,也覺得就是調用一個方法的問題,可是當我發現結果老是不對時,才發現原來JDK 提供的API中根本沒有這樣的方法,我也很惱火,也怪不得不少牛人在博客里怒斥Java標準庫中對日期的處理晦澀不堪的現狀,想這樣的功能提供也是理所應當的,也就說明Date,Calendar中提供的日期處理的功能不夠強大,因為已經有開源(Joda,某個知名的Java開源類庫,在時間日期的處理上相比Java標準庫更加強大且易用,IBM的日期類庫中提供了強大的功能),各大論壇中對這個問題爭論很多,可是很多都是考慮的比較簡單,每個月按30天計算,可能你會說,計算的這么精確嗎?答案是在一定的場合下是非常有必要的,在銀行,圖書館過期圖書計費,網絡流量計費等,都是按照自然月來計算的,需要考慮的因素很多,而不是簡單的30天,我現在需要的場合是Baby Care這款軟件中,要計算Baby的年齡,就是xx years,xx months,xx days,因為很多人需要用這個看看小孩是否滿月,是否周歲等,開始為了簡單,我們按30天每月,后來有人反饋,計算方法不對,只好讓用戶選擇,是每月按30天計算,還是按自然月計算。

按每月30天計算,論壇中常討論的方法,,并且似乎也是沒有問題的,但是往往計算的結果有時會相差一天:

public long diffValue(Date date1, Date date2)

{

//return date1.getTime() / (24*60*60*1000) - date2.getTime() / (24*60*60*1000);

return (date2.getTime() - date1.getTime() )/ 86400000; //用立即數,減少乘法計算的開銷

}

下面是正確的解法:

問題的關鍵是過濾掉時分秒,保留日期部分。干的活象低通濾波器,濾掉高頻雜波,保留低頻信號,/86400000,就是把時分秒全忽略掉了。

解法1:

public long differ(Date date1, Date date2)

{

//return date1.getTime() / (24*60*60*1000) - date2.getTime() / (24*60*60*1000);

return date2.getTime() / 86400000 - date1.getTime() / 86400000; //用立即數,減少乘法計算的開銷

}

解法2:

把date1,date2都設置為同樣的時間,我曾經設置date1為00:00:00,date2為23:59:59秒,在非常情況下,1S之差也會導致計算的天數少1.

private int daysBetween(Date now, Date returnDate) {

Calendar cNow = Calendar.getInstance();

Calendar cReturnDate = Calendar.getInstance();

cNow.setTime(now);

cReturnDate.setTime(returnDate);

setTimeToMidnight(cNow);

setTimeToMidnight(cReturnDate);

long todayMs = cNow.getTimeInMillis();

long returnMs = cReturnDate.getTimeInMillis();

long intervalMs = todayMs - returnMs;

return millisecondsToDays(intervalMs);

}

private int millisecondsToDays(long intervalMs) {

return (int) (intervalMs / (1000 * 86400));

}

private void setTimeToMidnight(Calendar calendar) {

calendar.set(Calendar.HOUR_OF_DAY, 0);

calendar.set(Calendar.MINUTE, 0);

calendar.set(Calendar.SECOND, 0);

}

解法3:

SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd");

java.util.Date date= myFormatter.parse("2003-05-1");

java.util.Date mydate= myFormatter.parse("1899-12-30");

long day=(date.getTime()-mydate.getTime())/(24*60*60*1000);

out.println(day);

上面的解法思想都一樣,都是忽略的時分秒,相比之下,第一種方法最為簡單,可是這些都是每月按30天計算的,自然月計算的方法系統API中沒有,總不至于為了使用這個方法,去引用開源的庫吧,但是這個問題的處理邏輯也是很復雜的,要考慮的因素很多,往往測試的時候,發現某種特例計算的結果不正確,煞為惱火,Java真不給力~~

基本上花了一下午的時間,去分析,然后畫了流程圖,寫成代碼,可能水平有限,方法雖然笨拙,但是還是能用的,如有不正確的地方,歡迎大家指正,也期待有更加簡單巧妙的方法。

相應代碼:

public static int[] getNeturalAge(Calendar calendarBirth,Calendar calendarNow) {

int diffYears = 0, diffMonths, diffDays;

int dayOfBirth = calendarBirth.get(Calendar.DAY_OF_MONTH);

int dayOfNow = calendarNow.get(Calendar.DAY_OF_MONTH);

if (dayOfBirth <= dayOfNow) {

diffMonths = getMonthsOfAge(calendarBirth, calendarNow);

diffDays = dayOfNow - dayOfBirth;

if (diffMonths == 0)

diffDays++;

} else {

if (isEndOfMonth(calendarBirth)) {

if (isEndOfMonth(calendarNow)) {

diffMonths = getMonthsOfAge(calendarBirth, calendarNow);

diffDays = 0;

} else {

calendarNow.add(Calendar.MONTH, -1);

diffMonths = getMonthsOfAge(calendarBirth, calendarNow);

diffDays = dayOfNow + 1;

}

} else {

if (isEndOfMonth(calendarNow)) {

diffMonths = getMonthsOfAge(calendarBirth, calendarNow);

diffDays = 0;

} else {

calendarNow.add(Calendar.MONTH, -1);// 上個月

diffMonths = getMonthsOfAge(calendarBirth, calendarNow);

// 獲取上個月最大的一天

int maxDayOfLastMonth = calendarNow .getActualMaximum(Calendar.DAY_OF_MONTH);

if (maxDayOfLastMonth > dayOfBirth) {

diffDays = maxDayOfLastMonth - dayOfBirth + dayOfNow;

} else {

diffDays = dayOfNow;

}

}

}

}

// 計算月份時,沒有考慮年

diffYears = diffMonths / 12;

diffMonths = diffMonths % 12;

return new int[] { diffYears, diffMonths, diffDays };

}

/**

* 獲取兩個日歷的月份之差

*

* @param calendarBirth

* @param calendarNow

* @return

*/

public static int getMonthsOfAge(Calendar calendarBirth,

Calendar calendarNow) {

return (calendarNow.get(Calendar.YEAR) - calendarBirth

.get(Calendar.YEAR))* 12+ calendarNow.get(Calendar.MONTH)

- calendarBirth.get(Calendar.MONTH);

}

/**

* 判斷這一天是否是月底

*

* @param calendar

* @return

*/

public static boolean isEndOfMonth(Calendar calendar) {

int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);

if (dayOfMonth == calendar.getActualMaximum(Calendar.DAY_OF_MONTH))

return true;

return false;

}

如果你有更好的方法,歡迎探討:-)

總結

以上是生活随笔為你收集整理的java 日期只计算年月日大小_Java按自然月计算两个日期相差的年月日?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 中文字幕在线观看 | 美女扒开腿让男人捅 | 日日夜夜免费视频 | 一级特黄特色的免费大片视频 | 国产精品 欧美激情 | 91热在线 | 神马久久久久久久久 | 欧美456| 久久久久中文字幕亚洲精品 | 亚洲视频在线观看免费视频 | 日韩欧美激情在线 | 狠狠躁夜夜躁人人爽视频 | av中亚 | 爱爱视频在线播放 | 国产一区二区免费看 | 老司机精品在线 | 美脚の诱脚舐め脚视频播放 | 久久免费少妇高潮久久精品99 | 久久人人插 | 色噜噜噜| 嫩草嫩草嫩草嫩草 | 91国视频| 超碰人人擦 | 风韵少妇spa私密视频 | 欧美精品少妇 | 国产精品视频999 | 久久不射网站 | 伊人看片 | 久久精品国产一区 | 成人片黄网站久久久免费 | 日韩av毛片在线观看 | 欧美午夜精品一区二区三区电影 | av成人在线免费观看 | 伊人久久五月天 | 日韩高清一二三区 | 伊人影院视频 | 爱爱激情网 | 久久精品国产亚洲AV熟女 | 欧美伊人网 | 蜜臀av首页| 在线欧美视频 | 特及毛片 | 久久国产片 | 99国产精品99 | 少妇被按摩师摸高潮了 | 亚洲一| 97超碰人人澡 | 精品国产鲁一鲁一区二区三区 | 欧美黄色小说视频 | 九九av | 欧美激情视频网址 | 欧美成年人视频在线观看 | 又黄又爽的免费视频 | 亚洲第一黄色网 | 岛国色图| 日韩深夜在线 | 精品不卡在线 | 亚洲成人一区二区在线观看 | 国产999精品久久久久久 | 久久久精品动漫 | 亚洲一二三区视频 | 性欧美18| 亚洲香蕉一区 | 日韩av男人天堂 | 在线观看亚洲精品视频 | 欧美怡红院视频 | 欧美激情精品久久久久 | 6080午夜伦理 | 久久免费少妇高潮久久精品99 | 精品婷婷色一区二区三区蜜桃 | 俄罗斯女人裸体性做爰 | 特黄网站 | 欧美精品区 | 国产免费久久精品国产传媒 | 欧美一级视频免费观看 | 国内成人综合 | 日韩美女视频网站 | 夜色伊人 | 日韩免费在线观看视频 | a√天堂资源在线 | 献给魔王伊伏洛基亚吧动漫在线观看 | 日韩在线播放一区 | 国产一级做a爰片久久毛片男男 | 制服丝袜影音先锋 | 国产精品无人区 | 美女色呦呦 | 9.1成人免费看片 | 日韩精品在线免费观看 | 恶虐女帝安卓汉化版最新版本 | 国产精品久久久久久久久久 | 国产日韩三级 | 日少妇的逼 | 综合av第一页 | 在线a毛片| 99精品一区二区三区无码吞精 | 久久亚洲AV成人无码一二三 | 久久久久人妻一区二区三区 | 夜色成人网 | 动漫美女无遮挡免费 |