获取当前年份和月份,从而产生奇怪的结果

2022-09-01 14:52:07

我正在研究一个与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开发的新手。谢谢。


答案 1

只是为了提供更多的背景:

两者都将正确提供在当前日期和时间初始化的日历。new GregorianCalendar()Calendar.getInstance()

MONTH并且是日历类中的常量。您不应该“通过”引用使用它们,这使得它们看起来像是对象状态的一部分。这是类设计的一个不幸部分,要访问不同字段的值,您需要使用指定为这些常量之一的字段编号进行调用,如其他答案所示:YEARCalendarget

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

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

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

我的建议:

  • 如果你的IDE允许它(就像Eclipse一样),那么创建诸如给编译时错误之类的表达式 - 如果你总是使用,你最终会得到更清晰的代码。c.YEARCalendar.YEAR
  • 在可能的情况下,使用Joda Time - 一个更好的Java日期/时间库。诚然,在Android上,你可能会有点空间受限,但是如果你的应用程序做了很多日期/时间操作,它会为你节省很多麻烦。

答案 2

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

int month=c.get(Calendar.MONTH)+1;