【问题标题】:Wrong year value from Calendar.get(Calendar.YEAR) [duplicate]Calendar.get(Calendar.YEAR) 中的错误年份值 [重复]
【发布时间】:2018-05-25 11:44:51
【问题描述】:

我得到以下代码的错误输出。

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

【问题讨论】:

  • 使用yyyy 而不是YYYY
  • 我建议你避免使用SimpleDateFormat 类。它不仅过时了,而且出了名的麻烦。今天我们在java.time, the modern Java date and time API 的表现要好得多。
  • 当我在我的计算机上运行您的代码时,d1 是 2018 年 12 月 31 日星期一 11:35:34 CET。大写 YYYY 是基于周的年份,仅对周数有用。缺少周数,SimpleDateFormat 似乎选择了第 1 周的第一天。这恰好发生在 2018 年。

标签: java


【解决方案1】:

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

 SimpleDateFormat format = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss a");

注意小写/大写会改变结果

|信 |日期/时间组件 | |是 |年份 | |是 |周年 | |米 |分钟 | |中号 |一年中的月份 |

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 稍微调整一下:以一周为基础的一年有 52 周 = 364 天或 53 周 =(正确)371 天。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多