2014-09-18 95 views
0

讓我們來看看你能否幫助我。我想在兩個日期(d1和d2)之間獲得週數(從星期一開始到星期日結束)。假設d2早於d1。代碼的這部分已經編程並正在工作。我現在的問題是,我無法正確編碼周程序。這是我現在所做的:在兩個日期之間獲得完整的「星期一至星期日」星期

public static void getFullWeeks(Calendar d1, Calendar d2){ 
    int Weeks = 0; 
    Calendar date2 = d2; 
    Calendar addWeek = GregorianCalendar.getInstance(); 
    addWeek.setTime(date2.getTime()); 
    addWeek.add(Calendar.DATE, 6); 

    while(addWeek.before(d1) || addWeek.equals(d1)){ 
     if(date2.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY){ 
      Weeks++; 
     } 
     date2.add(Calendar.DATE,1); 
    } 

    System.out.println(
     "The number of weeks (from monday to sunday) between both dates are: " 
     + Weeks); 
} 

但是輸出是「0周」,所以程序不工作。怎麼了?我沒有遇到這個錯誤,也沒有能力爲這個問題找到一個可行的解決方案。

謝謝!

+0

我們需要知道什麼是suma7。 – 2014-09-18 22:51:18

+0

使用[joda](http://www.joda.org/joda-time/)! – hd1 2014-09-18 22:52:52

+0

@ Jean-FrançoisSavard對不起,代碼是西班牙文,我把它翻譯成英文,忘記了這一點。現在已經修復了。 – Markomso 2014-09-18 23:05:16

回答

2

在Java 8沒有,你可以做類似下面的外部庫:

*編輯,以佔周從星期一開始

// TechTrip - ASSUMPTION d1 is earlier than d2 
// leave that for exercise 
public static long getFullWeeks(Calendar d1, Calendar d2){ 
    // In Java the week starts on Sunday from an integral perspective 
    // public final static int SUNDAY = 1; 
    // SEQUENTIAL UP TO 
    // public final static int SATURDAY = 7; 

    // make the starting date relative to the Monday we need to calculate from 
    int dayOfStartWeek = d1.get(Calendar.DAY_OF_WEEK); 

    // IF we have a partial week we should add an offset that moves the start 
    // date UP TO the next Monday to simulate a week starting on Monday 
    // eliminating partial weeks from the calculation 
    // NOTE THIS METHOD WILL RETURN NEGATIVES IF D1 < D2 after adjusting for 
    // offset 
    if (dayOfStartWeek == Calendar.SUNDAY) { 
     // add an offset of 1 day because this is a partial week 
     d1.add(Calendar.DAY_OF_WEEK, 1); 
    } else if (dayOfStartWeek != Calendar.MONDAY){ 
     // add an offset for the partial week 
     // Hence subtract from 9 accounting for shift by 1 
     // and start at 1 
     // ex if WEDNESDAY we need to add 9-4 (WED Int Val) = 5 days 
     d1.add(Calendar.DAY_OF_WEEK, 9 - dayOfStartWeek); 
    } 

    Instant d1i = Instant.ofEpochMilli(d1.getTimeInMillis()); 
    Instant d2i = Instant.ofEpochMilli(d2.getTimeInMillis()); 

    LocalDateTime startDate = LocalDateTime.ofInstant(d1i, ZoneId.systemDefault()); 
    LocalDateTime endDate = LocalDateTime.ofInstant(d2i, ZoneId.systemDefault()); 

    return ChronoUnit.WEEKS.between(startDate, endDate); 
} 

這裏的主:

public static void main(String[] args) { 
    Calendar d1 = Calendar.getInstance(); 
    Calendar d2 = Calendar.getInstance(); 
    d2.add(Calendar.WEEK_OF_YEAR, 6); 
    System.out.println(
      "The number of weeks (from monday to sunday) between both dates are: " 
      + getFullWeeks(d1, d2)); 
} 

的如果開始日期是星期一,則輸出如下:

該數字這兩個日期之間的週數(從星期一到星期日)爲:6

請注意,我沒有將日期d2分配給d1,使其成爲相同的參考。在這種情況下,你會得到0.

* ChronoUnit採取一個簡單的日期,時間或偏移量的時間。它們必須是相同的類型。時間可以用加號和減號操縱。

+0

在查看ChronoUnit時,理解計算是相對於絕對項的開始日期很重要。計算返回一個整數,表示兩個時間之間的完整單位數。例如,時間爲11:30和13:29之間的小時數將僅爲1小時,因爲這是兩小時的一分鐘時間 – TechTrip 2014-09-19 10:11:29

0

你的算法錯了;您的while循環需要比較您正在修改的相同日曆對象,但不這樣做,因此您要麼有無限循環,要麼立即退出,返回值爲0,具體取決於addDate是在d1之前還是之後(因爲沒有一個變化)。您的代碼應該是:

public static void getFullWeeks(Calendar d1, Calendar d2){ 
    int Weeks = 0; 
    Calendar addWeek = GregorianCalendar.getInstance(); 
    addWeek.setTime(d2.getTime()); 
    addWeek.add(Calendar.DATE, 6); 

    while(addWeek.before(d1) || addWeek.equals(d1)){ 
     if(addWeek.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY){ 
      Weeks++; 
     } 
     addWeek.add(Calendar.DATE,1); 
    } 

    System.out.println(
     "The number of weeks (from monday to sunday) between both dates are: " 
     + Weeks); 
} 
+0

一旦我意識到這是一項家庭作業問題,我幾乎刪除了我的答案。我要離開它,但是我也將給出答案,我幾乎將它替換爲:當你用調試器遍歷它時,問題是**非常顯着**。因此,這應該是您作爲Java學生的第一課:學習如何在一行中設置斷點,然後使用調試器運行以停止該行,逐行執行您的方法,檢查變量等。調試器將會爲您節省**小時**的猜測,瞭解您的問題出了什麼問題;它應該始終是您遇到任何問題的第一步。 – Tim 2014-09-19 00:31:29

0

在我看來,有幾個你做小錯誤:

1)你的輸出爲0星期,因爲在你的代碼的其他地方,你必須調用此方法與你的第一個參數d1,早於第二個參數,而在方法體中,則認爲d2早於d1。通過使用有意義的參數名稱很容易避免這種錯誤。在這種情況下適當的參數名稱是例如startend

2)如果使用其中d2早於d1的參數執行此方法,則您的方法將陷入無限循環。它在我看來加入date2不會更改addWeek中的日期。

3)您的方法計算從週二到週一而不是週一到週日的週數。要解決此問題,請在addWeek中添加7天而不是六個,或者更改while循環以僅在addWeekd1之前檢查並在週日增加weeks

把所有這些組合起來,我相信這會給你你在找什麼:

public static void getFullWeeks(Calendar start, Calendar end) 
{ 
    System.out.println("The number of weeks (from monday to sunday) between both dates are: " + getNrWeeksBetween(start, end)); 
} 

private static int getNrWeeksBetween(Calendar start, Calendar end) 
{ 
    int weeks = 0; 

    Calendar counter = new GregorianCalendar(); 
    counter.setTime(start.getTime()); 
    counter.add(Calendar.DATE, 6); 

    while(counter.before(end)) 
    { 
     if(counter.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) weeks++; 
     counter.add(Calendar.DATE, 1); 
    } 

    return weeks; 
} 
相關問題