我正在开发一个与Android相关的学习项目。我想要获得当前年份和时间一个月使用下面的代码,但它不适合我。
GregorianCalendar gc = new GregorianCalendar();
gc.YEAR // returning 1
gc.MONTH // returning 2
Calendar c = Calendar.getInstance();
c.YEAR // returning 1
c.MONTH // returning 2
有人能帮助我吗?难道我做错了什么?请原谅我,我是java开发新手。感谢。
答案 0 :(得分:63)
只是为了提供更多背景知识:
new GregorianCalendar()
和Calendar.getInstance()
都会正确地在当前日期和时间初始化日历。
MONTH
和YEAR
是Calendar
类中的常量。你应该不使用它们“通过”一个引用,使它看起来像是对象状态的一部分。设置Calendar
类是访问不同字段值的一个不幸的部分,您需要使用字段编号调用get
,指定为其中一个常量,如其他答案所示:
Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
请注意,月份数字是0,因此在撰写本文时(4月份),月份数字将为3。
这是Java语言设计的一个不幸的部分,你可以通过该类型的表达式引用静态成员(例如常量),而不是仅通过类型名称。
我的建议:
c.YEAR
这样的表达式会产生编译时错误 - 如果你总是使用Calendar.YEAR
,你最终会得到更清晰的代码。< / LI>
答案 1 :(得分:21)
注意MONTHS从0开始。因此,如果您需要将其映射到实际问题,只需添加+1
int month=c.get(Calendar.MONTH)+1;
答案 2 :(得分:5)
int year=c.get(Calendar.YEAR);
int month=c.get(Calendar.MONTH);
System.out.println(year);
System.out.println(month);
答案 3 :(得分:3)
YearMonth.now(
ZoneId.of( "America/Montreal" )
)
Answer by Jon Skeet是正确的。您正在访问常量而不是询问您自己的对象。
这是一个完全不同的选择,使用现代日期时间类。
java.util.Date
,java.util.Calendar
和java.text.SimpleTextFormat
等旧的日期时间类现在为legacy,取代java.time类。
YearMonth
如果您专注于没有日期,没有时间和没有时区的年份和月份,请使用YearMonth
课程。
不是仅传递年份和月份的整数,而是传递此类的对象。这样做可以提供类型安全性,确保有效值,并使您的代码更加自我记录。
确定当前年份和月份意味着确定当前日期。为此,时区至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。
ZoneId z = ZoneId.of( "America/Montreal" );
YearMonth ym = YearMonth.now( z );
您可以查询其中的部分。
int year = ym.getYear();
int month = ym.getMonthValue();
这个类提供了方便的方法,比如告诉你这是否是闰年。您可以进行数学运算,例如添加/减去月/年。您可以获得今年任何一天的日期。还有更多。
Month
我建议你使用Month
枚举,而不是乱用一个月的整数。该类预定义了十几个实例,一年中每个月都有一个实例。如上所述,使用对象可以为您提供类型安全,有效值和自我记录代码。
Month m = ym.getMonth();
该类有一些有用的方法,例如生成带有月份名称的本地化字符串。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和&amp; SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
答案 4 :(得分:2)
Calendar c= Calendar.getInstance()
int cyear = c.get(Calendar.YEAR);//calender year starts from 1900 so you must add 1900 to the value recevie.i.e., 1990+112 = 2012
int cmonth = c.get(Calendar.MONTH);//this is april so you will receive 3 instead of 4.
int cday = c.get(Calendar.DAY_OF_MONTH);
参考此LINK
答案 5 :(得分:1)
Calendar calendar = Calendar.getInstance();
int month = calendar.get(Calendar.MONTH) + 1;
int year = calendar.get(Calendar.YEAR);
添加1以获得正确的月份非常重要,因为第一个月值为0:
int month = calendar.get(Calendar.MONTH) + 1;
MONTH:get和set的字段编号,表示月份。这是特定于日历的值。格列高利历和朱利安历的一年中的第一个月是1月,即0;最后一个取决于一年中的月数。