我一直在使用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
答案 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)
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);
这里