获得当前年份和月份会产生奇怪的结果

Yaq*_*mad 24 java android date gregorian-calendar

我正在开发一个与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
Run Code Online (Sandbox Code Playgroud)

有人能帮我吗?难道我做错了什么?请原谅我,我是java开发的新手.谢谢.

Jon*_*eet 65

只是为了给出更多背景:

双方new GregorianCalendar()Calendar.getInstance()会给予正确的当前日期和时间初始化的日历.

MONTHYEAR常数的内Calendar类.你应该不是 "通过"的引用,这使它看起来像他们的对象的状态的一部分使用.在Calendar类的设计中,访问不同字段的值是一个不幸的部分,您需要get使用字段编号调用,指定为其中一个常量,如其他答案所示:

Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
Run Code Online (Sandbox Code Playgroud)

请注意,月份数字是从0开始的,因此在撰写本文时(4月份),月份数字将为3.

这是Java语言设计的一个不幸的部分,您可以通过该类型的表达式引用静态成员(例如常量),而不是通过类型名称.

我的建议:

  • 如果你的IDE允许它(就像Eclipse那样),那么make表达式c.YEAR会产生编译时错误 - 如果你总是使用它,你最终会得到更清晰的代码Calendar.YEAR.
  • 尽可能使用Joda Time - 一个更好的Java日期/时间库.不可否认,在Android上你可能有点空间限制,但如果你的应用程序做了很多日期/时间操作,它会为你节省很多麻烦.


Bal*_*hnu 21

注意MONTHS从0开始.因此,如果您需要将其映射到实际问题,只需添加+1

int month=c.get(Calendar.MONTH)+1;
Run Code Online (Sandbox Code Playgroud)


Sam*_*iya 5

int year=c.get(Calendar.YEAR);
int month=c.get(Calendar.MONTH);

   System.out.println(year);
   System.out.println(month);
Run Code Online (Sandbox Code Playgroud)