2017-01-02 44 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猜测我很累。我会接受你的答案,因为你用时间来记录它。 –