android計算生日的方法

前陣子遇到一個需求:計算生日漫蛔。假設(shè)生日是2016年2月1號幕袱,那么我需要得到一個“1歲28天”的字符串访得。我沒想到j(luò)ava或者android API里有現(xiàn)成的方法可以計算州既,ios小哥表示他的api里有日歷的方法氮凝,可以通過那個去得到羔巢。我很郁悶,就去網(wǎng)上找,去api里找竿秆,找了半天也沒找到启摄,感覺找的功夫自己寫可能就寫完了,于是我就開始自己寫:

/**
 * 獲取生日
 * @param currentTime
 * @param birthTime
 * @return
 */
public static String getHomeBirthday(long currentTime, long birthTime){
    Calendar currentCalendar = Calendar.getInstance();
    currentCalendar.setTimeInMillis(currentTime);
    int currentYear = currentCalendar.get(Calendar.YEAR);
    int currentMonth = currentCalendar.get(Calendar.MONTH);
    int currentDay = currentCalendar.get(Calendar.DAY_OF_MONTH);

    Calendar birthCalendar = Calendar.getInstance();
    birthCalendar.setTimeInMillis(birthTime);
    int birthYear = birthCalendar.get(Calendar.YEAR);
    int birthMonth = birthCalendar.get(Calendar.MONTH);
    int birthDay = birthCalendar.get(Calendar.DAY_OF_MONTH);

    int year = 0;
    int month = 0;
    int day = 0;

    if(currentYear == birthYear){
        //生日為本年
        if(currentMonth == birthMonth){
            //當(dāng)前月份等于生日月份
            day = currentDay - birthDay + 1;
        }else{
            //當(dāng)前月份大于生日月份
            if(currentDay >= birthDay){
                //當(dāng)前天數(shù)不小于生日天數(shù)幽钢,天數(shù)為兩者之差
                day = (currentDay - birthDay) + 1;
                month = currentMonth - birthMonth;
            }else{
                //當(dāng)前天數(shù)小于生日天數(shù)歉备,天數(shù)為上月天數(shù)減去兩者之差, 月數(shù)減一
                day = getMonthOfDays(currentYear, currentMonth) - (birthDay - currentDay) + 1;
                month = currentMonth - birthMonth - 1;
            }
        }
    }else{
        //生日為往年
        if(currentMonth >= birthMonth){
            //當(dāng)前月份大于生日月份,年份為正常年差
            year = currentYear - birthYear;
            if(currentDay >= birthDay){
                //當(dāng)前天數(shù)大于生日天數(shù)匪燕,月份為正常月差蕾羊,天數(shù)為兩者之差
                day = (currentDay - birthDay) + 1;
                month = currentMonth - birthMonth;
            }else{
                day = getMonthOfDays(currentYear, currentMonth) - (birthDay - currentDay) + 1;
                month = currentMonth - birthMonth - 1;
            }
        }else{
            //當(dāng)前月份小于生日月份,年份差減一
            year = currentYear - birthYear - 1;
            if(currentDay >= birthDay){
                //當(dāng)前天數(shù)大于生日天數(shù),月份為正常月差帽驯,天數(shù)為兩者之差
                day = (currentDay - birthDay) + 1;
                month = 12 - (birthMonth - currentMonth);
            }else{
                day = getMonthOfDays(currentYear, currentMonth) - (birthDay - currentDay) + 1;
                month = 12 - (birthMonth - currentMonth) - 1;
            }
        }
    }
    String yearStr = "";
    String monthStr = "";
    String dayStr = "";
    if(year > 0){
        yearStr = year + "歲";
    }
    if(month > 0){
        monthStr = month + "個月";
    }
    if(day > 0){
        dayStr = day + "天";
    }
    return yearStr + monthStr + dayStr;
}

/**
 * 獲取指定月份的天數(shù)
 *
 * @param year
 * @param month
 * @return
 */
public static int getMonthOfDays(int year, int month) {
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.YEAR, year);
    calendar.set(Calendar.MONTH, month - 1);
    calendar.set(Calendar.DATE, 1);
    calendar.roll(Calendar.DATE, -1);
    return calendar.get(Calendar.DATE);
}

把這個方法放上來是因?yàn)槲腋杏X還有可以改進(jìn)的地方龟再。如果您發(fā)現(xiàn)有可以改進(jìn)的地方或是有更方便的系統(tǒng)api方法,請告知尼变,感激不盡利凑!

2017.4.5修改

現(xiàn)在看太糙了,修改了一下:

/**
 * 獲取生日
 *
 * @param currentTime
 * @param birthTime
 * @return
 */
public static String getHomeBirthday(long currentTime, long birthTime) {
    Calendar currentCalendar = Calendar.getInstance();
    currentCalendar.setTimeInMillis(currentTime);
    int currentYear = currentCalendar.get(Calendar.YEAR);
    int currentMonth = currentCalendar.get(Calendar.MONTH);
    int currentDay = currentCalendar.get(Calendar.DAY_OF_MONTH);

    Calendar birthCalendar = Calendar.getInstance();
    birthCalendar.setTimeInMillis(birthTime);
    int birthYear = birthCalendar.get(Calendar.YEAR);
    int birthMonth = birthCalendar.get(Calendar.MONTH);
    int birthDay = birthCalendar.get(Calendar.DAY_OF_MONTH);

    int year = 0;
    int month = 0;
    int day = 0;

    day = currentDay - birthDay;
    if(day <= 0){
        day = getMonthOfDays(currentYear, currentMonth) - birthDay + currentDay;
        month = -1;
    }

    month += currentMonth - birthMonth;
    if(month < 0){
        month = 12 + month;
        year = -1;
    }

    year += currentYear - birthYear;

    if (year > 0) {
        return year + "歲" + month + "個月" + day + "天";
    }
    if (month > 0) {
        return month + "個月" + day + "天";
    } else {
        return day + "天";
    }
}

/**
 * 獲取指定月份的天數(shù)
 *
 * @param year
 * @param month
 * @return
 */
public static int getMonthOfDays(int year, int month) {
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.YEAR, year);
    calendar.set(Calendar.MONTH, month - 1);
    calendar.set(Calendar.DATE, 1);
    calendar.roll(Calendar.DATE, -1);
    return calendar.get(Calendar.DATE);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嫌术,一起剝皮案震驚了整個濱河市哀澈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌度气,老刑警劉巖割按,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蚯嫌,居然都是意外死亡哲虾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門择示,熙熙樓的掌柜王于貴愁眉苦臉地迎上來束凑,“玉大人,你說我怎么就攤上這事栅盲⊥羲撸” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵谈秫,是天一觀的道長扒寄。 經(jīng)常有香客問我,道長拟烫,這世上最難降的妖魔是什么该编? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮硕淑,結(jié)果婚禮上课竣,老公的妹妹穿的比我還像新娘嘉赎。我一直安慰自己,他們只是感情好于樟,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布公条。 她就那樣靜靜地躺著,像睡著了一般迂曲。 火紅的嫁衣襯著肌膚如雪靶橱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天路捧,我揣著相機(jī)與錄音关霸,去河邊找鬼。 笑死鬓长,一個胖子當(dāng)著我的面吹牛谒拴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涉波,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼炭序!你這毒婦竟也來了啤覆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤惭聂,失蹤者是張志新(化名)和其女友劉穎窗声,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辜纲,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡笨觅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了耕腾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片见剩。...
    茶點(diǎn)故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖扫俺,靈堂內(nèi)的尸體忽然破棺而出苍苞,到底是詐尸還是另有隱情,我是刑警寧澤狼纬,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布羹呵,位于F島的核電站,受9級特大地震影響疗琉,放射性物質(zhì)發(fā)生泄漏冈欢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一盈简、第九天 我趴在偏房一處隱蔽的房頂上張望凑耻。 院中可真熱鬧太示,春花似錦、人聲如沸拳话。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弃衍。三九已至呀非,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間镜盯,已是汗流浹背岸裙。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留速缆,地道東北人降允。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像艺糜,于是被迫代替她去往敵國和親剧董。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,769評論 25 707
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法破停,類相關(guān)的語法翅楼,內(nèi)部類的語法,繼承相關(guān)的語法真慢,異常的語法毅臊,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • 我對愛的理解就是,愛一定要促進(jìn)彼此的成長黑界,要讓彼此比想象的更優(yōu)秀管嬉。 如果因?yàn)槟愕倪@份“愛”,使兩個人不能在合適的時...
    darling9閱讀 393評論 0 0
  • 隨著護(hù)膚咨詢案例的增多求厕,發(fā)現(xiàn)護(hù)膚是多門學(xué)科的綜合體現(xiàn):美容學(xué)、美學(xué)扰楼、心理學(xué)呀癣、哲學(xué)...從美容學(xué)科的角度上講,護(hù)膚追...
  • 天氣晴 星期四 老遠(yuǎn)就看到女兒弦赖,非常開心的回家了项栏,因?yàn)榻裉彀l(fā)獎了《優(yōu)秀家長》,另外孩子還發(fā)了一本書蹬竖,也是女...
    陌上清歌的簡書閱讀 196評論 0 1