2015-03-25 38 views
3

這是我想做的事:與當前時間相比,檢查java.util.Date是否早於30天的最佳方法?

Date currentDate = new Date(); 
Date eventStartDate = event.getStartDate(); 

如何檢查是否eventStartDate比的currentdate年長超過30天?

我使用Java 8,日曆不是首選。

時區是ZoneId.systemDefault()。

+3

當天的哪一部分?哪個時區?什麼是3月30日之前或1月30日之後的「一個月」? (目前還不清楚你的意思是「從當天起一個月」。)你是否在使用Java 8,如果不是,你可以使用喬達時間嗎? (這可以使用java.util.Calendar完成,但如果可能的話,我會避免這樣做。) – 2015-03-25 10:23:19

+0

當前日期和新日期()中的日期。 30天。我確實使用Java8。我不想使用日曆。 – 2015-03-25 10:30:40

+3

「當前日期與新日期()」 - 不指定一天。它指定了一個時間點。例如,3月25日在倫敦的時間點可能是3月24日在舊金山。所以我們需要知道使用哪個時區。而「30天」與一個月不一樣......如果你真的*意味着* 30天,請編輯你的問題說出來。 – 2015-03-25 10:33:35

回答

5

好吧,假設你真的希望它是「提前30天」中的默認時區,我會使用類似:

// Implicitly uses system time zone and system clock 
ZonedDateTime now = ZonedDateTime.now(); 
ZonedDateTime thirtyDaysAgo = now.plusDays(-30); 

if (eventStartDate.toInstant().isBefore(thirtyDaysAgo.toInstant())) { 
    ... 
} 

如果「三十日前」是圍繞一個DST改變,你需要檢查爲plusDays文件給你的行爲,你想:

當轉換回ZonedDateTime,如果本地日期與時間的重疊,則偏移將如有可能保留,否則前面的偏移將會被使用。如果在差距中,本地日期時間將按差距的長度向前調整。

或者你減30「24小時時刻」天,這肯定會更簡單,但在DST的變化方面可能會出現意想不到的結果。

+0

是的,30天由於某種原因是必要的,謝謝你,Skeet先生。 – 2015-03-25 11:10:07

3

你可以試試這個:

Date currentDate = new Date(); 
Date eventStartDate = event.getStartDate(); 
long day30 = 30l * 24 * 60 * 60 * 1000; 
boolean olderThan30 = currentDate.before(new Date((eventStartDate .getTime() + day30))); 

這是disguisting,但它應該做的工作!

+2

假設每天都是24小時。這可能會或可能不符合要求 - 他們目前還不清楚:( – 2015-03-25 11:02:17

+0

我也讀過你的其他評論,並且我意識到你的意思是24小時之內。你是對的,目前還不清楚他目前是什麼意思date-30,但有方法可以截斷日期,所以解決這個問題並不是不可能的。 – gaRos 2015-03-25 11:13:44

+2

記得在第一個數字(「30l」)後面加上「l」,讓編譯器知道這些操作是在長數字上完成的 - 否則你會超出整數的範圍,結果將是完全錯誤的 – 2015-12-04 12:36:33

相關問題