2010-02-07 151 views
3

我想要一個例子:比較今天的日期+ 30天至另一個日期

DateFormat df = new SimpleDateFormat("MM/dd/yyyy"); 
String date = "03/09/2010"; //30 days from today 
Date usefullDate = df.parse(date); 

Calendar todaysDatePlus30Days = Calendar.getInstance(); 
todaysDatePlus30Days.add(Calendar.DAY_OF_YEAR, 30); 

System.out.println ("Compared Value: " + 
usefullDate.compareTo(todaysDatePlus30Days.getTime())) 

打印的值是-1。爲什麼它不打印0

我認爲問題在於todaysDatePlus30Days.getTime()也帶來了實際的時間。而usefullDate的時間爲00:00:00

所以下一個問題是我怎麼才能得到date

+0

請參閱下面的答案。 – Pointy 2010-02-07 18:33:01

回答

3

您解析的日期隱含在該日期的午夜。你構建的那個將是一天中的當前時間。

嘗試:

Calendar todayPlus30 = new GregorianCalendar() {{ 
    add(Calendar.DAY_OF_YEAR, 30); 
    set(Calendar.HOUR_OF_DAY, 0); 
    set(Calendar.MINUTE, 0); 
    set(Calendar.SECOND, 0); 
    set(Calendar.MILLISECOND, 0); 
}}; 

我可能有一對夫婦的常量錯了,你可以用Calendar.newInstance做到這一點(),如果你喜歡,儘管語法有一點不同。

+1

你的目標是正確的,但你不能繼承這樣的返回值。你將不得不保留一個引用並在該引用上調用這些集合,或者使用'new GregorianCalendar(){{' – Yishai 2010-02-07 18:34:08

+0

正確。我必須在'todayPlus30'對象上調用套件 – Omnipresent 2010-02-07 18:35:46

+0

哦,對不起;我總是使用GregorianCalendar,而我只是輸入機器人模式:-) – Pointy 2010-02-07 18:38:57

3

作爲進一步的評論,我會調查JodaTime所有與日期相關的Java工作。它更直觀,並且不會遇到日期/時間格式化和解析類中的線程問題(與標準Java庫不同)。現在這是一個實際上替換爲java.util.{Date,Calendar}混亂。

例如請參閱LocalDate類和它的plusDays()方法。

1

當你System.out.println(..)他們,結果是:

Tue Mar 09 00:00:00 EET 2010 
Tue Mar 09 20:31:39 EET 2010 

所以他們是不相等的 - 他們的小時不同。這是因爲Calendar.getInstance()返回當前日期時間。

如果你想他們是平等的,你必須set(..)的小時,分​​鍾和秒字段爲0

1

如果添加以下行你的榜樣,你會學到有用日期有不同的時間

System.out.println ("" + usefullDate); 
System.out.println ("" + todaysDatePlus30Days.getTime()); 
0

我建議使用JodaTime,但如果您使用長日期/時間,你可以做...

long todaysDay = System.currentTimeMillis()/MILLIS_PER_DAY; 
long in30days = todaysDay + 30; 
long usefulDay = usefulDate.getTime()/MILLIS_PER_DAY; 
if (in30days == usefulDay) // days are the same. 

注:執行計算爲每克MT + 0時區。這可以有所作爲。