【问题标题】:Calendar.Month gives wrong outputCalendar.Month 给出错误的输出
【发布时间】:2013-01-22 05:02:12
【问题描述】:

我一直在使用java.util 来表示所有日期和日历。但我在这里面临一个奇怪的问题。 Calendar.MONTHCalendar.DAY_OF_MONTH 等都给出错误的输出。但是当我使用Calendar.getTime() 时,我得到了正确的输出。可能是什么问题?

public class TestClass {

    public static void main(String[] args) {
        Calendar rightNow = Calendar.getInstance();
        System.out.println(rightNow.MONTH);
        System.out.println(rightNow.DAY_OF_MONTH);
        System.out.println(rightNow.YEAR);
        System.out.println(rightNow.getTime());
    }
}

同样的输出是:

2
5
1
Tue Jan 22 10:31:44 GMT+05:30 2013

【问题讨论】:

标签: java calendar


【解决方案1】:
    System.out.println(rightNow.MONTH);
    System.out.println(rightNow.DAY_OF_MONTH);
    System.out.println(rightNow.YEAR);
    System.out.println(rightNow.getTime());

您正在打印日历常量值。

如果你想要值,你需要做get....

例子:

    System.out.println(rightNow.get(Calendar.MONTH));

阅读Calendar javadoc了解更多信息。

【讨论】:

  • 我正在做 mCalendar.setDate(java.util.Date) 但仍然给我错误的月份值
  • 实际上这是 Java Calendar API 的问题,第一个月是 0 而不是 1 :-)
  • 如果您打印一月的第一个月,它将打印 0 而不是 1
【解决方案2】:

Calendar.MONTH 不返回当前月份。它是一个常数,其值为 2。

来源:

public final static int MONTH = 2;

在Calendar的get方法中作为参数使用

public int get(int field) {...}

Calendar 的设计源于 Java 的早期,当时的许多约定都不同、不存在或正在发展。 Oracle(以及更早的 Sun)永远不会让像 java.util.Calendar API 这样的 API 成为当今标准 API 的一部分。

并且,为了完整起见,请使用 Joda Time 而不是 Java 的 Date 和 Calendar API。

【讨论】:

    【解决方案3】:

    java.time

        ZonedDateTime rightNow = ZonedDateTime.now(ZoneId.of("Africa/Cairo"));
        System.out.println(rightNow.getMonth());
        System.out.println(rightNow.getMonthValue());
        System.out.println(rightNow.getDayOfMonth());
        System.out.println(rightNow.getYear());
        System.out.println(rightNow);
    

    刚才运行时的输出是:

    FEBRUARY
    2
    15
    2019
    2019-02-15T21:15:06.313809+02:00[Africa/Cairo]
    

    不要使用日历

    Calendar 类令人困惑并且设计不佳,所以难怪你想知道。幸运的是,在您提出这个问题的第二年,ZonedDateTime 和 java.time(现代 Java 日期和时间 API)中的其他类取代了它。所以现在不要再使用Calendar

    Calendar 类试图非常通用,因此它没有getMonth 方法等,而是具有可以读取和设置的字段 的概念。由于它早在 Java 拥有 enums 之前就已经设计好了,因此每个字段都有一个数字和一个用于该数字的命名常量。所以YEAR(时代)是1,MONTH是2,等等。要获取Calendar对象的字段值,你应该调用get方法传递适当的命名常量,例如rightNow.get(Calendar.MONTH)。只使用rightNow.MONTH 是一个经常重复的错误。它只是为您提供常量 2 的值。

    链接

    Oracle tutorial: Date Time 解释如何使用 java.time。

    【讨论】:

      【解决方案4】:
          Calendar now = Calendar.getInstance();
          out.println("month now= " + (now.get(Calendar.MONTH)+1));
      

      或与公历:

          GregorianCalendar nu  = new GregorianCalendar();
          int day = nu.get(Calendar.DAY_OF_MONTH);
          int month = (nu.get(Calendar.MONTH)+1);  //month +1 because january`==0
          int year= nu.get(Calendar.YEAR);
          int hour= nu.get(Calendar.HOUR_OF_DAY);
          int minutes= nu.get(Calendar.MINUTE);
      

      这里

      【讨论】:

      • 请将您的所有代码包装在代码块中。欢迎来到 SO。
      • 感谢您的贡献。如前所述,我们不应该再使用CalendarGregorianCalendar,所以坦率地说,我认为帮助用户如何做到这一点就像帮助他们做他们不应该做的事情。相反,我鼓励你学习java.time, the modern Java date and time API
      • 感谢您给我这个选项。我刚刚学习了 Calendar 类以及如何使用它。我一定会检查 java.time。
      猜你喜欢
      • 1970-01-01
      • 2020-09-08
      • 2021-02-11
      • 2013-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多