以'yyyy-MM-dd'格式计算当前年份会在Java中设置不正确的值

时间:2014-02-10 10:48:28

标签: java

我使用以下代码以yyyy-MM-dd格式计算当前年份值 但是下面的代码将 paramStartDate值指定为0001-01-01,这是不正确的 它应该是'2014-01-01'

else if(scopeSelected != null && scopeSelected.equalsIgnoreCase("Year To Date")){

                    Calendar calendarStart = Calendar.getInstance();
                    calendarStart.set(Calendar.YEAR,calendarStart.YEAR);
                    calendarStart.set(Calendar.MONTH,0);
                    calendarStart.set(Calendar.DAY_OF_MONTH,1);
                    Date startDate=calendarStart.getTime();
                    DateFormat dateFormat1 = new SimpleDateFormat("yyyy-MM-dd");
                    paramStartDate = dateFormat1.format(startDate);
                    setParamStartDate(paramStartDate);
                }   

3 个答案:

答案 0 :(得分:10)

这是问题所在:

calendarStart.set(Calendar.YEAR,calendarStart.YEAR);

您将值设置为Calendar.YEAR,这是值为1的常量。

如果您不想更改年份数,请完全删除此行。

(顺便说一句,我强烈建议使用Joda Time而不是内置的Java API.Joda Time 很多更清洁。)< / p>

编辑:对于添加一年的新要求,您可以使用

calendarStart.add(Calendar.YEAR, 1);

答案 1 :(得分:2)

你的表达式calendarStart.YEAR是指Calendar.YEAR这是一个值为1的常量。它不是年份!

这里有一个很明显的Calendar-API问题。它使用int作为字段的类型,而不是专门的对象/字段类型,因此这些错误变得很常见。将它与Java 8中的新风格进行比较,即:

LocalDate date = ...;
date = date.with(ChronoField.YEAR, 2014);

请注意,在另一个更现代的库(内置于Java 8中)中,对象ChronoField.YEAR不是int,因此这样的错误是不可能的。

答案 2 :(得分:1)

只需删除此行:

calendarStart.set(Calendar.YEAR,calendarStart.YEAR);// actually your setting the Year by 1

或者像这样添加年份:

calendarStart.set(Calendar.YEAR, 2014);

然后尝试这样的代码:

else if(scopeSelected != null && scopeSelected.equalsIgnoreCase("Year To Date")){

                Calendar calendarStart = Calendar.getInstance();
                calendarStart.set(Calendar.MONTH,0);
                calendarStart.set(Calendar.DAY_OF_MONTH,1);
                Date startDate=calendarStart.getTime();
                DateFormat dateFormat1 = new SimpleDateFormat("yyyy-MM-dd");
                paramStartDate = dateFormat1.format(startDate);
                setParamStartDate(paramStartDate);
            }