2012-06-20 94 views
3

我遇到了Java日曆add()功能的問題。給予或拿來用於提供在旅行網站上出發的日期的迂迴日期。Java日曆添加問題

end.add(Calendar.DATE, Integer.parseInt(giveOrTake)); 

的代碼是上面和我使用的測試條件是選擇29/07/2012之日起3天給予或採取。根據文件,這應該出來作爲01/08/2012,但它出來於01/07/2012。

我檢查了giveOrTake,當它傳遞給方法,它很好,所以我不知道發生了什麼。我可以對giveOrTake值進行硬編碼,但仍然會出現錯誤。

+5

請發佈一個簡短但完整的程序來演示此問題。 (哦,理想情況下,轉移到Joda時間 - 它更合理。) –

+1

您是如何生成輸出的? (在8月的Java日曆中是7個月......) – Affe

+0

對於忽視這個問題的道歉。原來,這是SimpleDateFormat使用'毫米'而不是'MM' –

回答

0

正是有了日期格式的問題。當它應該是'yyyyMMdd'時,它被設置爲yyyymmdd

+1

這就是當你在問題中沒有提供足夠的信息時發生的情況。根據這些信息,任何人都無法幫助你 - 但如果你提供了一個實際上證明了這個問題的程序,它會很快被發現。 –

5

工作對我來說:

import java.util.*; 

public class Test { 
    public static void main (String []args) { 
     Calendar calendar = Calendar.getInstance(); 
     calendar.set(2012, Calendar.JULY, 29); 
     calendar.add(Calendar.DATE, 3); 
     System.out.println(calendar.getTime()); // August 1st 
    } 
} 

我的猜測是,你有一個月錯誤調用add前 - 注意我到set通話的上述使用爲一個月,因爲調用使用基於0的月份數字。

注意,按照我對這個問題的評論,你會好得多,如果你可以移動到Joda Time ......

+0

零月基於相當誤導imo – keuleJ

+0

@keuleJ:絕對是一個問題。只是使用Joda的衆多原因之一。 –

+0

@JonSkeet你可以使用'Calendar.JUNE'等常數來避免基於0的問題。 –

0

您正在使用麻煩的舊日期時間類,現在是遺留的,由java.time類代替。

另外,您正在使用日期 - 時間對象來表示僅限日期的值,不適合。

使用java.time

LocalDate類表示沒有時間一天和不同時區的日期,唯一的價值。

LocalDate ld = LocalDate.of(2012 , 7 , 29) ; 
LocalDate threeDaysLater = ld.plusDays(3); 

ld.toString():2012-07-29

threeDaysLater.toString():2012-08-01

參見code run live in IdeOne.com


關於java.time

java.time框架是建立在Java 8和更高版本。這些類取代了日期時間類legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time項目現在位於maintenance mode,建議遷移到java.time類。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310

從何處獲取java.time類?

ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval,YearWeek,YearQuartermore