34

我正在使用以下代码

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

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

4

4 回答 4

61

您可以看到 +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
于 2013-01-31T04:46:08.587 回答
7

你必须使用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
于 2013-01-31T04:46:28.077 回答
2

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

  • Joda-Time 2.3 库
    • 与 Java 捆绑在一起的 java.util.Date 和 .Calendar 类的流行替代品
    • 开源
    • 免费的
    • 积极维护(截至 2014-02)
  • java.time

示例代码

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 );

转储到控制台...</p>

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

运行时……</p>

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
于 2014-02-24T01:04:48.157 回答
1
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 */ );
}
于 2013-01-31T04:42:14.600 回答