3

我一直在使用java.util所有日期和日历表示。但我在这里面临一个奇怪的问题。Calendar.MONTH, Calendar.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
4

4 回答 4

8
    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));

阅读日历 javadoc了解更多信息。

于 2013-01-22T05:06:14.763 回答
5

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。

于 2013-01-22T05:08:53.207 回答
2

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 日期和时间 API java.time 中的其他类取代。所以现在再也不要使用Calendar了。

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

关联

Oracle 教程:日期时间解释如何使用 java.time。

于 2019-02-15T19:15:21.957 回答
0
    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);

这里

于 2020-08-15T14:42:46.010 回答