Java 日期年份计算按年关闭两天

2022-09-02 14:25:13

如果你能想象的话,这在我的软件中导致了一个Y2K风格的错误。奇怪的是,一年的计算只发生在一年中的两天,我不太确定如何进行故障排除。

输出:

03-Jan-2013
02-Jan-2013
01-Jan-2013
31-Dec-2013 ** strange
30-Dec-2013 ** strange
29-Dec-2012
28-Dec-2012
27-Dec-2012
26-Dec-2012
25-Dec-2012

我不确定Java日期实用程序的哪个部分会导致这样的错误。

代码(由于测试太小,我包含了一个完整的工作程序):

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

public class DateT {

        private static String getFormattedBackscanStartTime(int days) {

                SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-YYYY");
                Calendar workingDate = Calendar.getInstance();
                workingDate.add(Calendar.DATE, -1 * days);

                String formattedStartTime = dateFormat.format(workingDate.getTime());
                return formattedStartTime;
        }

        public static void main(String args[]) {

                for(int i = 35; i < 45; i++) {
                        System.out.println(getFormattedBackscanStartTime(i));
                }
        }
}

答案 1

这就是问题所在:

"dd-MMM-YYYY"

YYYY是周-年,而不是日历年。相反,你想要。yyyy

2012日历年的最后两天是2013年第一周。通常只应将周年与“一年中的一周”说明符 () 结合使用。w


答案 2

我假设你正在使用.java 1.7

上面的代码片段将无法与引发一个一样工作(YYYY 在java 1.6SimpleDateFormat("dd-MMM-YYYY")java.lang.IllegalArgumentExceptionjava 1.6)

您需要使用 代替 。yyyyYYYY

Y -> week-year
y -> year

这里

编辑

适用于 :yyyy

$ java DateT
03-Jan-2013
02-Jan-2013
01-Jan-2013
31-Dec-2012
30-Dec-2012
29-Dec-2012
28-Dec-2012
27-Dec-2012
26-Dec-2012
25-Dec-2012