2012-10-17 51 views
3

我想減去5天,從該進來作爲一個字符串開始的日期。爪哇 - 減去天從日期

我看過一些關於這個主題的其他帖子,但是我從代碼中得到的結果總是不正確的。主要的問題是,今年價值似乎沒有改變的時候,天相減,例如 - 2012-01-01 subtract 5 days gives me 'Jan 27 2012'使用此代碼 -

cal.add(Calendar.DATE, -5); 

請幫助。

+1

你如何解析字符串「2012-01-01」到「日曆」?我懷疑你有一個錯誤。 – Jesper

回答

6

你知道嗎,在Java中,月份1實際上是2月?

Date februaryTheFirst = new Date(2012,1,1); // equals 2012-02-01 

這可能解釋你所看到的。如果你要實例2012-01-01相反,你應該做的:

Calendar.getInstance().set(2012,0,1); // 2012-01-01 

一定要檢查的文檔Date(int, int, int)Calendar.set(int, int, int)

Date firstDayOf2012 = new Date(2012,0,1); // this is 2012-01-01 

完全一樣的東西與Calendar打交道時發生。此外,你可以檢查你解析字符串的方式。如果您使用SimpleDateFormat.parse(...),事情可能會更容易。

奇怪,不是嗎?去圖...正如一個有趣的事實,的IntelliJ的文檔註釋這第二個參數,月份,@MagicConstant,要記住,有事情很奇怪的東西程序員。

-1

用途:

cal.add(Calendar.DAY_OF_MONTH, -5) 

編輯:對不起。 DAY_OF_MONTHDATE的同義詞。而不是1使用Calendar.JANUARY

0

Calendar.FEBRUARY是前1五天2012年2月1日爲27戳刺2012

-1

該代碼段是工作在我的電腦。首先你必須讓日曆實例執行你的計算。

  Calendar cal = Calendar.getInstance(); 
    System.out.println("Today : " + cal.getTime()); 
    // Subtract 300 days from the calendar 
    cal.add(Calendar.DATE, -300); 
    System.out.println("300 days ago: " + cal.getTime()); 

這是輸出,你會得到:

Today : Wed Oct 17 10:41:23 EET 2012 
    300 days ago: Thu Dec 22 10:41:23 EET 2011 
0

你的實現是正確的,你得到正確的值ASLO。

Calendar的月開始0

0 = Jan 
1 = Feb 

所以減去5 days2012-01-01肯定會返回你Jan 27 2012 的東西在這裏也是這將有助於你Why is January month 0 in Java Calendar?

0

喬達時間

的Joda-Time 2.7庫使這項工作更容易。只需撥打minusDays方法即可。

String input = "2012-01-01"; 
DateTimeZone zone = DateTimeZone.forID("America/Montreal"); 
DateTime dateTime = new DateTime(input, zone); 
DateTime then = now.minusDays(5); 
DateTimeFormatter formatter = DateTimeFormat.forStyle("FF").withZone(zone).withLocale(Locale.CANADA_FRENCH); 
String output = formatter.print(then); 

如果你想在一天的開始,添加一個調用withTimeAtStartOfDay。在你的情況下,這是沒有必要的,當解析一個沒有時間的日期字符串時。

DateTime dateTimeAtStartOfDay = new DateTime(input, zone).withTimeAtStartOfDay(); 

如果你只想要日期沒有時間的日或時區,使用LocalDate代替日期時間。

LocalDate then = new LocalDate("2012-01-01").minusDays(5); 

如果你需要轉換到老java.util.Date,呼籲日期時間toDate

java.time

Java 8有一個新的包java.time。這些新課程受到Joda-Time的啓發,但被重新設計。 java.time和Joda-Time都可以很好地解決這個問題。