Calendar.Month输出错误

时间:2013-01-22 05:02:13

标签: java calendar

我一直在使用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

4 个答案:

答案 0 :(得分: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));

阅读Calendar javadoc了解详情。

答案 1 :(得分:5)

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

来自消息来源:

public final static int MONTH = 2;

它用作Calendar的get方法

中的参数
public int get(int field) {...}

日历的设计源于Java的早期,当今许多惯例都不同,不存在或正在发展。 Oracle(以及之前的Sun)绝不会让像java.util.Calendar API这样的API成为当今标准API的一部分。

而且,为了完整性,请使用Joda Time而不是Java的日期和日历API。

答案 2 :(得分:1)

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方法等,而是具有可以读取和设置的 fields 概念。 。由于它是在Java拥有enum之前很久才设计的,因此每个字段都有一个数字和该数字的命名常量。因此YEAR(时代)为1,MONTH为2,依此类推。要获取Calendar对象的字段值,您应该调用get方法传递适当的命名常量,例如rightNow.get(Calendar.MONTH)。仅使用rightNow.MONTH是经常重复的错误。它只是为您提供常数2的值。

链接

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

答案 3 :(得分:0)

    Calendar now = Calendar.getInstance();
    out.println("month now= " + (now.get(Calendar.MONTH)+1));

与GregorianCalender一起使用:

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

这里