Java 計算時間差之年齡問題
阿新 • • 發佈:2019-01-30
我們在做系統開發的時候,往往會用到人的年齡,但是年齡是動態變化的,所以一般都不進行儲存,而是選擇儲存人的生日,通過生日動態算出人的年齡。而有時候年齡需要用到週歲(月、天),這種比較具體的時間,如果小於1歲,需要具體到月,小於1月,具體到天,不足一天的按一天算,只是將當前年份減去出生日期的年份往往不準確。
比如,一個人是1999年12月31日出生的,而當前時間是2000年1月1日,如果按照剛才說的那種方法計算的話,得到的年齡是1歲,而實際年齡只有1天。
錯誤思路:使用如下程式碼計算天數及天數以下的事件(天、小時、分鐘...)可以精確計算,但是使用365的倍數計算年就會出現錯誤資料,如同月數不一定是30天
DateFormat df = new SimpleDateFormat("yyyy:MM:dd"); Date d1 = df.parse("2013:12:31"); Date d2 = df.parse("2015:4:12"); long diff = d1.getTime() - d2.getTime(); long years = diff / (1000 * 60 * 60 * 24 * 365); long days = diff / (1000 * 60 * 60 * 24); long hours = (diff - days * (1000 * 60 * 60 * 24)) / (1000 * 60 * 60); long minutes = (diff - days * (1000 * 60 * 60 * 24) - hours * (1000 * 60 * 60)) / (1000 * 60); System.out.println(years + "年" + "" + days + "天" + hours + "小時" + minutes + "分"); try { System.out.println(getAgeStr(d1)); } catch (Exception e) { e.printStackTrace(); }
正確思路:通過Calendar類和Thu Jan 01 08:00:00 CST 1970 這個日曆類的起始時間
Calendar c1 = Calendar.getInstance(); long nowmillSeconds = c1.getTimeInMillis(); Calendar c2 = Calendar.getInstance(); c2.setTime(birthday); long birmillSeconds = c2.getTimeInMillis(); Calendar c3 = Calendar.getInstance(); long millis = nowmillSeconds - birmillSeconds; c3.setTimeInMillis(millis); int year = c3.get(Calendar.YEAR); int month = c3.get(Calendar.MONTH); int day = c3.get(Calendar.DAY_OF_MONTH); int hour = c3.get(Calendar.HOUR_OF_DAY); if (year > 1970) { return year - 1970 + "歲"; } else if (month > Calendar.JANUARY) { return month - Calendar.JANUARY + "月"; } else if (day > 1) { return day - 1 + "天"; }else{ return "1天"; }
注意事項:
使用Calendar時一定要注意月份問題,Calendar.MONTH從0開始計算的,及一月份對應的值是0。所以,從身份證號或者生日之類的資料中取出月份值要減去1再賦值到Calendar中。