【问题标题】:Getting current Year and Month resulting strange results获取当前年份和月份导致奇怪的结果
【发布时间】:2012-04-15 11:30:24
【问题描述】:

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

【问题讨论】:

    标签: java android date gregorian-calendar


    【解决方案1】:

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

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

    【讨论】:

    • int cmonth = c.get(Calendar.MONTH);//这是 4 月,所以您将收到 3 而不是 4。
    • 投反对票的人...在接受的答案中查看此行...要使其与实际月份兼容,您必须添加 1..否则一月将为 0...如果你不明白不要投票...不要-1
    • 对于合理的编号,请使用现代方法和 java.time 类:LocalDate.now().getMonthValue() ➙ 1-12 月为 1 月至 12 月。
    【解决方案2】:

    只是为了提供更多背景:

    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,您最终会得到更清晰的代码。
    • 尽可能使用Joda Time - 一个更好的Java 日期/时间库。诚然,在 Android 上,您可能会受到空间的限制,但如果您的应用程序执行大量日期/时间操作,则可以省去很多麻烦。

    【讨论】:

    • @YaqubAhmad:我很高兴 - 其他两个答案是正确,但我觉得他们可以做更多解释:)
    【解决方案3】:
    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

    【讨论】:

      【解决方案4】:

      如何获取当前年份和月份。

              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 字段编号,表示月份。这是特定于日历的值。公历和儒略历中的第一个月是 JANUARY,即 0;最后一个取决于一年中的月数。

      【讨论】:

      • 这个可怕的 Calendar 类在几年前被 java.time 类所取代,采用 JSR 310。现代方法:LocalDate.now().getMonthValue()
      【解决方案5】:

      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.DateCalendarSimpleDateFormat

      Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

      要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

      从哪里获得 java.time 类?

      【讨论】:

        【解决方案6】:
        int year=c.get(Calendar.YEAR);
        int month=c.get(Calendar.MONTH);
        
           System.out.println(year);
           System.out.println(month);
        

        【讨论】:

        • 仅供参考,c.get(Calendar.MONTH) 是从零开始的月份索引。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-05
        相关资源
        最近更新 更多