【问题标题】:Calendar issue in Adding month +1 to to calendar month in Android在 Android 中将月份 +1 添加到日历月份中的日历问题
【发布时间】:2013-01-31 04:40:13
【问题描述】:

我正在使用以下代码

Calendar cal = Calendar.getInstance();
System.out.println("Before "+cal.getTime());
cal.set(Calendar.MONTH, 01);
System.out.println("After "+cal.getTime());

输出是

Before Thu Jan 31 10:07:34 IST 2013
After Sun Mar 03 10:07:34 IST 2013

+1 添加到jan 是给ma​​r 个月。如果我们在当前日期加上 30 天,它可能会返回正确的输出。但我想显示 feb 月。任何人都可以帮助我吗..

【问题讨论】:

    标签: java android date


    【解决方案1】:

    您可以看到 +1 设置字段正在添加与您的日期不同的 30 天日期(从您的输出中观察到。)

    如果您想要几个月,请使用代码

    Calendar cal = Calendar.getInstance();
    System.out.println("Before "+cal.getTime());  //Before Thu Jan 31 10:16:23 IST 2013
    
    cal.add(Calendar.MONTH, 1);
    System.out.println("After "+cal.getTime()); //After Thu Feb 28 10:16:23 IST 2013
    

    【讨论】:

    • Calendar.add(Calendar.MONTH, 1) 不加 30 天,它正好加 1 个月。 Calendar cal = Calendar.getInstance(); DateFormat df = new SimpleDateFormat("dd-MMM-yyy"); cal.setTime(df.parse("20-FEB-2015")); System.out.println("Before "+cal.getTime()); //Before Fri Feb 20 00:00:00 EET 2015 cal.add(Calendar.MONTH, 1); System.out.println("After "+cal.getTime()); //After Fri Mar 20 00:00:00 EET 2015我正在使用 JDK 7
    • 不是 30 天。可以是 29、30 或 31。
    【解决方案2】:

    这种日期时间工作更容易使用:

    • Joda-Time2.3库
      • 与 Java 捆绑的 java.util.Date 和 .Calendar 类的流行替代品
      • 开源
      • 免费
      • 积极维护(截至 2014 年 2 月)
    • java.time package

    示例代码

    DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" ); // Or, DateTimeZone.UTC
    DateTime dateTime = new DateTime( timeZone );
    DateTime monthAgo = dateTime.plusMonths( -1 ); // Smartly handles various month lengths, leap year, and so on.
    DateTime monthLater = dateTime.plusMonths( 1 );
    

    转储到控制台...

    System.out.println( "dateTime: " + dateTime );
    System.out.println( "monthAgo: " + monthAgo );
    System.out.println( "monthAgo start of day: " + monthAgo.withTimeAtStartOfDay() );
    System.out.println( "monthLater: " + monthLater );
    

    运行时……

    dateTime: 2014-02-24T01:53:22.386+01:00
    monthAgo: 2014-01-24T01:53:22.386+01:00
    monthAgo start of day: 2014-01-24T00:00:00.000+01:00
    monthLater: 2014-03-24T01:53:22.386+01:00
    

    【讨论】:

      【解决方案3】:

      你必须使用add()like,

      cal.add(Calendar.MONTH, 1);
      

      输出->

      Before Thu Jan 31 10:15:04 IST 2013
      After Thu Feb 28 10:15:04 IST 2013
      

      【讨论】:

        【解决方案4】:
        cal.set(Calendar.MONTH, cal.get( Calendar.MONTH ) + 1 );
        

        无论如何它显示Mar 3的原因是因为它显然增加了30天,即Feb 31st不存在,所以它转到Mar 3

        如果您想要下个月的最后一天,您可以这样做:

        int month = cal.get( Calendar.MONTH );
        cal.set(Calendar.MONTH, cal.get(Calendar.MONTH) + 1);
        if( cal.get( month ) > month + 1 ) {
            cal.set( Calendar.MONTH, month + 1 );
            cal.set( Calendar.DAY, /* here comes your day amount finding algorithm */ );
        }
        

        【讨论】:

        • 这将具有相同的效果。 0 + 1 = 1,这是 OP 已经传递给 set() 的内容。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多