Java Calendar.get(Calendar.year)中的年份值错误

Java Calendar.get(Calendar.year)中的年份值错误,java,Java,对于下面的代码,我得到了错误的输出 class Test{ public static void main(String[] args) { String dateStr = "May 11, 2019 11:35:34 AM"; SimpleDateFormat format = new SimpleDateFormat("MMM dd, YYYY HH:mm:ss a"); try{

对于下面的代码,我得到了错误的输出

class Test{
        public static void main(String[] args) {
            String dateStr = "May 11, 2019 11:35:34 AM";
            SimpleDateFormat format = new SimpleDateFormat("MMM dd, YYYY HH:mm:ss a");
            try{
                Date d1 = format.parse(dateStr);
                Calendar cal = Calendar.getInstance();
                cal.setTime(d1);
                System.out.println(cal.get(Calendar.YEAR));
                System.out.println(Calendar.YEAR);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
O/p
2018年

预期O/p

2019

您应使用小写字母
y
,如下所示:

 SimpleDateFormat format = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss a");
请注意,小写/大写会更改结果

| Letter | Date/Time component | | y | Year | | Y | Week year | | m | Minute | | M | Month in year | |信函|日期/时间部分| |年| |年|周| |分钟| |一年中的月数|
您应使用小写字母
y
,如下所示:

 SimpleDateFormat format = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss a");
请注意,小写/大写会更改结果

| Letter | Date/Time component | | y | Year | | Y | Week year | | m | Minute | | M | Month in year | |信函|日期/时间部分| |年| |年|周| |分钟| |一年中的月数|
日历有两种类型。ISO周日期和另一个公历日期。ISO周日期有52或53个整周,这意味着根据闰年与否,它不会有正常的365/366天,而是365/371天(365+1周)。yyyy是我们知道的正常日历年

或者,您可以使用GregorianCalendar代替日历,如下所示,以获得YYYY或YYYY的相同结果-

GregorianCalendar gregcal = new GregorianCalendar();
gregcal.setTime(d1);
System.out.println(gregcal.getWeekYear());

日历有两种类型。ISO周日期和另一个公历日期。ISO周日期有52或53个整周,这意味着根据闰年与否,它不会有正常的365/366天,而是365/371天(365+1周)。yyyy是我们知道的正常日历年

或者,您可以使用GregorianCalendar代替日历,如下所示,以获得YYYY或YYYY的相同结果-

GregorianCalendar gregcal = new GregorianCalendar();
gregcal.setTime(d1);
System.out.println(gregcal.getWeekYear());

使用
yyyy
而不是
yyy
我建议您避免使用
SimpleDateFormat
类。它不仅早已过时,而且还出了名的麻烦。今天,我们的情况好多了。当我在我的电脑上运行你的代码时,
d1
是2018年12月31日星期一11:35:34 CET。大写字母
YYYY
表示基于周的年份,仅对周数有用。由于缺少周数,似乎
SimpleDateFormat
选择了第1周的第一天。而这恰好发生在2018年。使用
yyyy
而不是
yyy
我建议您避免使用
SimpleDateFormat
类。它不仅早已过时,而且还出了名的麻烦。今天,我们的情况好多了。当我在我的电脑上运行你的代码时,
d1
是2018年12月31日星期一11:35:34 CET。大写字母
YYYY
表示基于周的年份,仅对周数有用。由于缺少周数,似乎
SimpleDateFormat
选择了第1周的第一天。而这恰好发生在2018年。只是一个轻微的调整:基于周的一年有52周=364天或53周=(正确)371天。只是一个轻微的调整:基于周的一年有52周=364天或53周=(正确)371天。