【问题标题】:Java Calendar date errorJava 日历日期错误
【发布时间】:2012-10-20 08:54:59
【问题描述】:

谁能帮我理解为什么我得到不同的月份值

SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");    
System.out.println(dateFormat.format(cal.getTime()) 
                   + "--" 
                   + cal.get(Calendar.MONTH));

令人惊讶的显示

09/09/2012--8

【问题讨论】:

  • 我们都可以获得一个回答堆积的徽章吗? :)

标签: java date calendar simpledateformat


【解决方案1】:

Calendar 类中,MONTH 从索引0 开始。所以,January 是 0,February 是 1,因此 September 是 8。

P.S.:- 确实,这是 Calendar 类中的 Inconsistency,所以我建议你看看 Joda-Time API,让你在使用 date 时更轻松-时间数据。

【讨论】:

  • cal 是使用 cal.set(Calendar.YEAR, 2010); cal.set(Calendar.MONTH, 1); cal.set(Calendar.DAY_OF_MONTH, 1); 实例化的
  • @赖。然后你需要发布完整的代码。我们没有看到任何设置日历值的代码。如果您将Calendar.MONTH 设置为1,则为February
  • 天哪!解决了它。为什么不一致,Calendar.DAY_OF_MONTH, 1 返回该月的第一天!
  • @赖。因为那是在实施中。请参阅 Calendar 类的文档。我已经在我的答案中给出了链接。
  • @赖。您可以更好地使用Joda Time API,通过 Dates 让您的生活更轻松。
【解决方案2】:

您可能的问题是Calendar uses a zero-based index for months。所以格式正确输出了 9 月的 9,但 getter 返回了 8

这是否愚蠢和不一致的日历?是的!请改用Joda-Time API 处理日期和时间。据我所知,在JSR 310 出现之前,它目前是事实上的标准。

【讨论】:

    【解决方案3】:

    Calendar.MONTH 返回基于 0 的值,即 JANUARY 用 0 表示。这样 SEPTEMBER 为 8。

    【讨论】:

      【解决方案4】:

      日历中的月份从 0 开始

      【讨论】:

        【解决方案5】:

        其他答案都是正确的。 java.util.Calendar 类对月份数字使用从零开始的计数。避免使用 java.util.Date/Calendar 类的众多原因之一。

        使用Joda-Time 2.3 库可以更轻松地完成此类工作。值得庆幸的是,它明智地使用了从一开始的计数,例如一月 = 1,十二月 = 12。

        java.util.Calendar cal = java.util.Calendar.getInstance();
        
        // Though not required here for this one purpose, it's better to specify a time zone than rely on default.
        DateTimeZone timeZone = DateTimeZone.forID( "America/Montreal" );
        DateTime dateTime = new DateTime( cal.getTime(), timeZone );
        
        // Extract month. Note how these two lines call similar sounding methods that are actually quite different.
        // One returns a primitive int value. The other returns an object of nested class DateTime.Property.
        int monthNumber = dateTime.getMonthOfYear();
        String monthName = dateTime.monthOfYear().getAsText( Locale.FRENCH );
        

        转储到控制台...

        System.out.println( "dateTime: " + dateTime );
        System.out.println( "monthNumber: " + monthNumber );
        System.out.println( "monthName: " + monthName );
        

        运行时……

        dateTime: 2014-02-10T02:58:35.386-05:00
        monthNumber: 2
        monthName: février
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-07-10
          • 2014-06-16
          • 1970-01-01
          • 1970-01-01
          • 2010-11-27
          • 1970-01-01
          • 2019-05-12
          • 1970-01-01
          相关资源
          最近更新 更多