2017-01-02 67 views
0

我很難與包含Calendar.add()Calendar.add()的問題纏繞在一起,我需要進行完整性檢查。使用java日曆減去1天時得到錯誤的日期

我的集成測試今天開始在我正在進行的項目上失敗。我認爲這與我通過減去x天數來計算日期的方法有關。

由於某些原因,當我從今天(2017年1月2日星期一)減去1天后,我得到2016-01-01的結果?我期望2017-01-01?

我嘗試了其他日期,它似乎工作正常,但似乎當它是一天的任何一年的星期一第2年它減去1年太多,而不是一天?

我在某些情況下誤解了一些基本的東西減去天數?

... 

// fails. Result is 2010-01-01?? 
SimpleDateFormat format = new SimpleDateFormat("YYYY-MM-dd"); 
Calendar now = Calendar.getInstance(); 
now.set(2011, 0, 2); 
now.add(Calendar.DATE, -1); 
assertEquals("2011-01-01", format.format(now.getTime())); 

... 
// fails. Result is 2016-01-01?? 
SimpleDateFormat format = new SimpleDateFormat("YYYY-MM-dd"); 
Calendar now = Calendar.getInstance(); 
now.set(2017, 0, 2); 
now.add(Calendar.DATE, -1); 
assertEquals("2017-01-01", format.format(now.getTime())); 

... 

// works fine. 
SimpleDateFormat format = new SimpleDateFormat("YYYY-MM-dd"); 
Calendar now = Calendar.getInstance(); 
now.set(2017, 0, 5); 
now.add(Calendar.DATE, -1); 
assertEquals("2017-01-04", format.format(now.getTime())); 

... 

// works fine. 
SimpleDateFormat format = new SimpleDateFormat("YYYY-MM-dd"); 
Calendar now = Calendar.getInstance(); 
now.set(2016, 0, 2); 
now.add(Calendar.DATE, -1); 
assertEquals("2015-01-01", format.format(now.getTime())); 

... 
+5

替換'和'yyyy' YYYY'!閱讀['SimpleDateFormat'](http://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html)的javadoc,*請!!! * – Andreas

+0

Omg ...我知道這是蹩腳的..這就是爲什麼我需要一個健全的檢查。其中一個util類是今天重構的,格式字符串被複制粘貼並從網頁中搜索並替換(https://www.w3.org/TR/NOTE-datetime)。哈哈,我會接受所有喜歡簡單事物的快樂。謝謝! –

+1

不知道爲什麼它被downvoted,除了你的代碼不能完全運行。捕捉足夠詳細的測試來檢測它。 – Gene

回答

1

使用小寫yyyy,而不是在你的格式設置模式的大寫YYYY。正如在這裏看到:

import java.text.SimpleDateFormat; 
import java.util.Calendar; 

public class Dates { 
    public static void main(String args[]){ 
     // OK 
     SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); 
     Calendar now = Calendar.getInstance(); 
     now.clear(); 
     now.set(2011, 0, 2); 
     now.add(Calendar.DAY_OF_MONTH, -1); 
     System.out.println(("2011-01-01".equals(format.format(now.getTime())))); 
     System.out.println(format.format(now.getTime())); 

     // OK 
     format = new SimpleDateFormat("yyyy-MM-dd"); 
     now = Calendar.getInstance(); 
     now.clear(); 
     now.set(2017, 0, 2); 
     now.add(Calendar.DAY_OF_MONTH, -1);  
     System.out.println(("2017-01-01".equals(format.format(now.getTime())))); 
     System.out.println(format.format(now.getTime())); 

     // OK 
     format = new SimpleDateFormat("yyyy-MM-dd"); 
     now = Calendar.getInstance(); 
     now.clear(); 
     now.set(2017, 0, 5); 
     now.add(Calendar.DAY_OF_MONTH, -1); 
     System.out.println(("2017-01-04".equals(format.format(now.getTime())))); 
     System.out.println(format.format(now.getTime())); 

     // OK 
     format = new SimpleDateFormat("yyyy-MM-dd"); 
     now = Calendar.getInstance(); 
     now.clear(); 
     now.set(2016, 0, 2); 
     now.add(Calendar.DAY_OF_MONTH, -1); 
     System.out.println(("2016-01-01".equals(format.format(now.getTime())))); 
     System.out.println(format.format(now.getTime())); 
    } 
} 

OUTPUT:

true 
2011-01-01 
true 
2017-01-01 
true 
2017-01-04 
true 
2016-01-01 
+0

是的,謝謝:-) Andreas指出我的錯誤。完全錯過了它,甚至在發佈之前檢查了文檔:-P猜測我很累。我會接受你的答案,因爲你用時間來記錄它。 –