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

时间:2012-04-15 11:30:25

标签: 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

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

6 个答案:

答案 0 :(得分:63)

只是为了提供更多背景知识:

new GregorianCalendar()Calendar.getInstance()都会正确地在当前日期和时间初始化日历。

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

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

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

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

我的建议:

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

答案 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)

TL;博士

YearMonth.now( 
    ZoneId.of( "America/Montreal" ) 
)

详细

Answer by Jon Skeet是正确的。您正在访问常量而不是询问您自己的对象。

这是一个完全不同的选择,使用现代日期时间类。

避免遗留日期时间类

java.util.Datejava.util.Calendarjava.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.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance 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;最后一个取决于一年中的月数。