使用Calendar獲取DAY_OF_WEEK本週開始和結束的時間戳

和獲取今日開始和結束的時間戳一樣,本週開始和結束的時間戳,就是以本週第一天開始的00:00到本週最後一天的23:59分結束。

需要注意的是,國際上是以星期日爲一週第一天的開始,Calendar中提供的DAY_OF_WEEK獲取的一週也是以星期日作爲一週的開始。

而中國的習慣是以星期一作爲一週的開始,所以需要根據項目的實際需求來設置。


1、以星期日作爲一週的開始

/**
* start
* 本週開始時間戳
*/
public static String getWeekStartTime() {
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat( "yyyyMMdd", Locale.getDefault());
    Calendar cal = Calendar.getInstance();
    // 獲取星期日開始時間戳
    cal.set(Calendar. DAY_OF_WEEK, Calendar.SUNDAY);
    return simpleDateFormat.format(cal.getTime()) + "000000000";
}

/**
* end
* 本週結束時間戳
*/
public static String getWeekEndTime() {
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat( "yyyyMMdd", Locale.getDefault());
    Calendar cal = Calendar.getInstance();
    // 獲取星期六結束時間戳
    cal.set(Calendar. DAY_OF_WEEK, Calendar.SATURDAY );
    return simpleDateFormat.format(cal.getTime()) + "235959999";
}

2、以星期一作爲一週的開始

在設置星期一爲一週第一天的時候遇到個坑

查閱api的時候看到了這個函數setFirstDayOfWeek()


然後代碼是這樣寫的:

/**
* start
* 本週開始時間戳
*/
public static String getWeekStartTime() {
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat( "yyyyMMdd", Locale.getDefault());
    Calendar cal = Calendar.getInstance();
    cal.setFirstDayOfWeek(Calendar.MONDAY);
    // 獲取星期一開始時間戳
    cal.set(Calendar. DAY_OF_WEEK, Calendar.MONDAY);
    return simpleDateFormat.format(cal.getTime()) + "000000000";
}

/**
* end
* 本週結束時間戳
*/
public static String getWeekEndTime() {
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat( "yyyyMMdd", Locale.getDefault());
    Calendar cal = Calendar.getInstance();
    cal.setFirstDayOfWeek(Calendar.MONDAY);
    // 獲取星期日結束時間戳
    cal.set(Calendar. DAY_OF_WEEK, Calendar.SUNDAY);
    return simpleDateFormat.format(cal.getTime()) + "235959999";
}

這兩個方法在本週的星期一到星期六的時候,獲取到的數據是正常的,確實返回的是本週星期一到星期日的時間戳。

但是到了本週星期日的時候出現問題了,兩方法在星期日的時候,獲取到的是下個星期一和下個星期日的日期!

最後找了半天的資料,原來是對setFirstDayOfWeek的理解出了問題

Calendar中的星期一、二、三、四、五、六、日、DAY_OF_WEEK等都是以一個常量的形式存在的,我們設置setFirstDayOfWeek()並不能改變這些常量的值


參考:https://coderanch.com/t/381293/java/java/setFirstDayOfWeek-Calendar


正確的代碼應該這樣寫:

/**
* start
* 本週開始時間戳 - 以星期一爲本週的第一天
*/
public static String getWeekStartTime() {
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat( "yyyyMMdd", Locale. getDefault());
    Calendar cal = Calendar.getInstance();
    int day_of_week = cal.get(Calendar. DAY_OF_WEEK) - 1;
    if (day_of_week == 0 ) {
        day_of_week = 7 ;
    }
    cal.add(Calendar.DATE , -day_of_week + 1 );
    return simpleDateFormat.format(cal.getTime()) + "000000000";
}

/**
* end
* 本週結束時間戳 - 以星期一爲本週的第一天
*/
public static String getWeekEndTime() {
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat( "yyyyMMdd", Locale. getDefault());
    Calendar cal = Calendar.getInstance();
    int day_of_week = cal.get(Calendar. DAY_OF_WEEK) - 1;
    if (day_of_week == 0 ) {
        day_of_week = 7 ;
    }
    cal.add(Calendar.DATE , -day_of_week + 7 );
    return simpleDateFormat.format(cal.getTime()) + "235959999";
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章