2016-04-25 107 views
1

因此,對於任務,我們必須使用JDK Date或Calendar對象來表示我們正在設計的系統中的日期(否則我將使用另一個庫)。對於一個函數,我需要確保從輸入日期到目前的日期至少已過去了若干年。我寫了下面的方法,以兩個日曆對象之間嘗試並計算天數:計算Java中兩個日期或日曆對象之間的日期

public static int daysSince(Calendar pastDate) { 
    Calendar presentDate = Calendar.getInstance(); 

    int daysSince = 0; 

    while (pastDate.before(presentDate)) { 
     pastDate.add(Calendar.DAY_OF_MONTH, 1); 
     daysSince++; 
    } return daysSince; 
} 

但是,這種方法似乎總是恰好返回比兩個日期之間的實際的天數少30天,我可以」 t似乎弄清楚爲什麼?例如,它表示2016年3月25日至2016年4月25日期間只有一天。我錯過了什麼?

+0

看到這個http://stackoverflow.com/questions/1555262/calculating-the-difference-between-two-java-date-instances –

回答

2

你的代碼工作主要是(proof)。我懷疑你的測試數據有什麼問題。

例如,它表示2016/3/25和2016/4/25之間只有一天。

我懷疑你創建測試日期(3/25/2016)不正確。請記住,MONTH值開始,所以要創建2016年3月25日你需要:

past.set(Calendar.DAY_OF_MONTH, 25); 
past.set(Calendar.MONTH, 2);   // NOTE THE 2 
past.set(Calendar.YEAR, 2016); 

我懷疑你使用3,你需要2,並且有一天你看到的是因爲你的測試日期是在午夜,你現在的日期不是。

除了你可能想要更好地處理時間,該代碼的作品。

+1

@ transiti0nary:從根本上改變問題,一旦他們回答(或者坦白地說甚至在此之前,因爲人們可能在尋找答案)在SO上是不合適的;問題並不意味着成爲移動目標。如果您有新問題,請提出一個新問題。我已經回滾了編輯(您仍然可以獲取其內容[這裏](http://stackoverflow.com/posts/36837338/revisions)來構建您的新問題)。 –

0

而是循環的,你可以做這樣的:

public static int daysSince(Calendar pastDate) { 
    Calendar presentDate = Calendar.getInstance(); 
    long millisInADay = 1000 * 60 * 60 * 24; 

    return(pastDate.getTimeInMillis()-presentDate.getTimeInMillis())/millisInADay; 
} 
+0

請參閱[這裏](http://stackoverflow.com/a/3491711/157247)爲什麼這樣天真地做這個主意不好。 –

+0

謝謝。我確實生產了另一個不涉及循環的實現,但現在我遇到了將閏年考慮進去的問題,即將日期轉換爲年。 JDK中是否有類似於我在實現中使用的TimeUnit枚舉類型的轉換工具,可以實現這一點?謝謝 – transiti0nary

+0

我認爲在這種情況下使用LocalDate是最好的方法。 https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html –

-1

確保在設置過去的日期,這幾個月被視爲形式0-11。

Calendar presentDate = Calendar.getInstance(); //25th April, 2016 
    Calendar pastDate = Calendar.getInstance(); 
    pastDate.set(2016, 2, 25); //its 25th March, 2016 here 
    int daysSince = 0; 
    while(pastDate.before(presentDate)){ 
     pastDate.add(Calendar.DAY_OF_MONTH, 1); 
     daysSince++; 
    } 
    System.out.println(daysSince); 
//output : 31 
+0

謝謝,我只是忘記了0-索引。然而,我現在遇到了另一個問題,我更新了描述它的原始文章。 – transiti0nary

相關問題