1. 程式人生 > >Java 計算時間差之年齡問題

Java 計算時間差之年齡問題

        我們在做系統開發的時候,往往會用到人的年齡,但是年齡是動態變化的,所以一般都不進行儲存,而是選擇儲存人的生日,通過生日動態算出人的年齡。而有時候年齡需要用到週歲(月、天),這種比較具體的時間,如果小於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中。