使用Java日历减去1天时出错日期

时间:2017-01-02 17:46:27

标签: java

我很难解决与Calendar.add()有关的问题,我需要进行健全检查。

我正在进行的项目中,我的集成测试今天开始失败。我认为这与我通过减去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()));

...

1 个答案:

答案 0 :(得分:2)

在格式设置模式中使用小写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()));
    }
}

输出:

true
2011-01-01
true
2017-01-01
true
2017-01-04
true
2016-01-01