JAVA Calendar 輸入星期幾漱受,返回指定時間的日期

今天收到朋友的求助媳危。要求完成以下需求:

根據傳入的星期幾得到日期荞彼,當前時間對應的星期大于傳入的星期值是則為下一周的時間。如當前時間2019-01-08 星期二待笑,傳入一個星期一那么這個星期一對應的就是2019-01-14鸣皂,而不是01-07

且需要考慮到閏年,12月份暮蹂,1月份寞缝,2月份,7/8月份等特殊情況仰泻。

也當作一次練習荆陆,固記錄此次過程。

本次代碼使用JAVA作為開發(fā)語言集侯。

思路:

  1. 獲取當前星期幾
  2. 獲取當前年月日
  3. 判斷當前星期幾與目標星期幾是否一致 flag = 0 為 同為當前星期被啼,flag = 1 為大于當前星期 帜消,flag = -1 為小于當前星期
  4. 編寫maxDay方法,將月份和年份作為參數傳入浓体,返回指定年月最大天數
  5. 調用maxDay方法泡挺,獲取當前月份最大天數
  6. 獲取兩個時間間的差距天數
  7. 實現邏輯
  8. 編寫測試方法進行測試

完整代碼模塊:

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class main {
    public static String process(int weekday){
        Calendar calendar;
        calendar = Calendar.getInstance();
        // flag = 0 為 同為當前星期,flag = 1 為大于當前星期 命浴,flag = -1 為小于當前星期
        int flag = 0;
        //獲取當前星期幾
        int now_week = calendar.get(Calendar.DAY_OF_WEEK) - 1;
        if(now_week == 0){
            now_week = 7;
        }
        //獲取當前時間
        String now_date = "當前時間:"+calendar.get(Calendar.YEAR )+"年"+(calendar.get(Calendar.MONTH) + 1)+"月"+calendar.get(Calendar.DAY_OF_MONTH)+"日";
        StringBuilder sb = new StringBuilder();
        sb.append("輸出日期為:");
        String now_day = String.valueOf(calendar.get(Calendar.DAY_OF_MONTH));
        String now_month = String.valueOf(calendar.get(Calendar.MONTH) + 1);
        String now_year = String.valueOf(calendar.get(Calendar.YEAR ));
        if(weekday != now_week){
            //同為當前星期
            if(weekday > now_week){
                //輸入星期大于當前日期
                flag =1;
            }
            else{
                //輸入星期小于當前日期
                flag = -1;
            }
        }
        int max_day = maxDay(Integer.valueOf(now_month),Integer.valueOf(now_year));
        //兩星期數之間的絕對差距日期
        int distance = Math.abs(weekday - now_week);
        switch(flag){
            case 0:
                sb.append(now_year + "年");
                sb.append(now_month + "月");
                sb.append(now_day+ "日");
                return sb.toString();
            case 1:
                if((Integer.valueOf(now_day) + distance) > max_day){
                    //如果當前日期加上差距日期大于最大值天數
                    if(Integer.valueOf(now_month) + 1 > 12){
                        //如果當前月份為12月
                        sb.append((Integer.valueOf(now_year) + 1) + "年");
                        sb.append("1月");
                        sb.append(((Integer.valueOf(now_day) + distance) - max_day) + "日");
                        return sb.toString();
                    }
                    else{
                        //不為12月娄猫,正常處理
                        sb.append(now_year + "年");
                        sb.append((Integer.valueOf(now_month) + 1) + "月");
                        sb.append(((Integer.valueOf(now_day) + distance) - max_day) + "日");
                        return sb.toString();
                    }
                }
                else{
                    //加起來不大于最大天數,則正常輸出
                    sb.append(now_year + "年");
                    sb.append(now_month + "月");
                    sb.append((Integer.valueOf(now_day) + distance) + "日");
                    return sb.toString();
                }
            case -1:
                if(((Integer.valueOf(now_day) - distance) < 0)){
                    //如果當前日期減去差距日期小于最小值天數0
                    if(Integer.valueOf(now_month) - 1 < 0){
                        //如果當前月份為1月
                        sb.append((Integer.valueOf(now_year) - 1) + "年");
                        sb.append("12月");
                        sb.append(maxDay(12,(Integer.valueOf(now_year) - 1)) - Math.abs((Integer.valueOf(now_day) - distance)) + "日");
                        return sb.toString();
                    }
                    else{
                        //不為12月咳促,正常處理
                        sb.append(now_year + "年");
                        sb.append((Integer.valueOf(now_month) - 1) + "月");
                        sb.append(maxDay((Integer.valueOf(now_month) - 1) ,(Integer.valueOf(now_year))) - Math.abs((Integer.valueOf(now_day) - distance)) + "日");
                        return sb.toString();
                    }
                }
                else{
                    //減起來不小于最小天數稚新,則正常輸出
                    sb.append(now_year + "年");
                    sb.append(now_month + "月");
                    sb.append((Integer.valueOf(now_day) - distance) + "日");
                    return sb.toString();
                }
        }
        return "";
}
    public static String process(int weekday, String testYear, String testMonth, String testDay){
        Calendar calendar;
        calendar = Calendar.getInstance();
        DateFormat sm = new SimpleDateFormat("yyyy-MM-dd");
        Date date = new Date();
        try {
            date = sm.parse(testYear+"-"+testMonth+"-"+testDay);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        calendar.setTime(date);
        // flag = 0 為 同為當前星期,flag = 1 為大于當前星期 跪腹,flag = -1 為小于當前星期
        int flag = 0;
        //獲取當前星期幾
        int now_week = calendar.get(Calendar.DAY_OF_WEEK) - 1;
        if(now_week == 0){
            now_week = 7;
        }
        //獲取當前時間
        //String now_date = "當前時間:"+calendar.get(Calendar.YEAR )+"年"+(calendar.get(Calendar.MONTH) + 1)+"月"+calendar.get(Calendar.DAY_OF_MONTH)+"日";
        StringBuilder sb = new StringBuilder();
        sb.append("輸出日期為:");
        String now_day = String.valueOf(calendar.get(Calendar.DAY_OF_MONTH));
        String now_month = String.valueOf(calendar.get(Calendar.MONTH) + 1);
        String now_year = String.valueOf(calendar.get(Calendar.YEAR ));
        if(weekday != now_week){
            //同為當前星期
            if(weekday > now_week){
                //輸入星期大于當前日期
                flag =1;
            }
            else{
                //輸入星期小于當前日期
                flag = -1;
            }
        }
        int max_day = maxDay(Integer.valueOf(now_month),Integer.valueOf(now_year));
        //兩星期數之間的絕對差距日期
        int distance = Math.abs(weekday - now_week);
        switch(flag){
            case 0:
                sb.append(now_year + "年");
                sb.append(now_month + "月");
                sb.append(now_day+ "日");
                return sb.toString();
            case 1:
                if((Integer.valueOf(now_day) + distance) > max_day){
                    //如果當前日期加上差距日期大于最大值天數
                    if(Integer.valueOf(now_month) + 1 > 12){
                        //如果當前月份為12月
                        sb.append((Integer.valueOf(now_year) + 1) + "年");
                        sb.append("1月");
                        sb.append(((Integer.valueOf(now_day) + distance) - max_day) + "日");
                        return sb.toString();
                    }
                    else{
                        //不為12月褂删,正常處理
                        sb.append(now_year + "年");
                        sb.append((Integer.valueOf(now_month) + 1) + "月");
                        sb.append(((Integer.valueOf(now_day) + distance) - max_day) + "日");
                        return sb.toString();
                    }
                }
                else{
                    //加起來不大于最大天數,則正常輸出
                    sb.append(now_year + "年");
                    sb.append(now_month + "月");
                    sb.append((Integer.valueOf(now_day) + distance) + "日");
                    return sb.toString();
                }
            case -1:
                if(((Integer.valueOf(now_day) - distance) < 0)){
                    //如果當前日期減去差距日期小于最小值天數0
                    if(Integer.valueOf(now_month) - 1 < 0){
                        //如果當前月份為1月
                        sb.append((Integer.valueOf(now_year) - 1) + "年");
                        sb.append("12月");
                        sb.append(maxDay(12,(Integer.valueOf(now_year) - 1)) - Math.abs((Integer.valueOf(now_day) - distance)) + "日");
                        return sb.toString();
                    }
                    else{
                        //不為12月冲茸,正常處理
                        sb.append(now_year + "年");
                        sb.append((Integer.valueOf(now_month) - 1) + "月");
                        sb.append(maxDay((Integer.valueOf(now_month) - 1) ,(Integer.valueOf(now_year))) - Math.abs((Integer.valueOf(now_day) - distance)) + "日");
                        return sb.toString();
                    }
                }
                else{
                    //減起來不小于最小天數屯阀,則正常輸出
                    sb.append(now_year + "年");
                    sb.append(now_month + "月");
                    sb.append((Integer.valueOf(now_day) - distance) + "日");
                    return sb.toString();
                }
        }
        return "";
    }
    public static void main (String[] args){
        System.out.println(process(6));
        //test();
    }
    public static void test(){
        System.out.println(process(7,"2018","12","29"));
    }
    private static int maxDay(int month, int year){
        int dayNum = 0;
        if(year%4 == 0){
            //閏年,二月份有29天
            if(month == 2){
                //二月份轴术,輸出最大天數為29
                dayNum = 29;
            }
            else if(month == 7 || month == 8){
                //七月份难衰,八月份最大天數為31天
                dayNum = 31;
            }
            else{
                //其他月份按正常處理,單數為大,雙數為小
                dayNum = month%2 == 0 ?  30 : 31;
            }
        }
        else{
            //二月份有28天
            if(month == 2){
                //二月份逗栽,輸出最大天數為28
                dayNum = 28;
            }
            else if(month == 7 || month == 8){
                //七月份盖袭,八月份最大天數為31天
                dayNum = 31;
            }
            else{
                //其他月份按正常處理,單數為大,雙數為小
                dayNum = month%2 == 0 ?  30 : 31;
            }
        }
        return dayNum;
    }
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末彼宠,一起剝皮案震驚了整個濱河市鳄虱,隨后出現的幾起案子,更是在濱河造成了極大的恐慌凭峡,老刑警劉巖拙已,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異摧冀,居然都是意外死亡倍踪,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門索昂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來建车,“玉大人,你說我怎么就攤上這事楼镐●荆” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵框产,是天一觀的道長凄杯。 經常有香客問我错洁,道長,這世上最難降的妖魔是什么戒突? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任屯碴,我火速辦了婚禮,結果婚禮上膊存,老公的妹妹穿的比我還像新娘导而。我一直安慰自己,他們只是感情好隔崎,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布今艺。 她就那樣靜靜地躺著,像睡著了一般爵卒。 火紅的嫁衣襯著肌膚如雪虚缎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天钓株,我揣著相機與錄音实牡,去河邊找鬼。 笑死轴合,一個胖子當著我的面吹牛创坞,可吹牛的內容都是我干的。 我是一名探鬼主播受葛,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼题涨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了总滩?” 一聲冷哼從身側響起携栋,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎咳秉,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體鸯隅,經...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡澜建,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了蝌以。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炕舵。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖跟畅,靈堂內的尸體忽然破棺而出咽筋,到底是詐尸還是另有隱情,我是刑警寧澤徊件,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布奸攻,位于F島的核電站蒜危,受9級特大地震影響,放射性物質發(fā)生泄漏睹耐。R本人自食惡果不足惜辐赞,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望硝训。 院中可真熱鬧响委,春花似錦、人聲如沸窖梁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纵刘。三九已至邀窃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間彰导,已是汗流浹背蛔翅。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留位谋,地道東北人山析。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像掏父,于是被迫代替她去往敵國和親笋轨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內容