如何在Java中添加一个月到当前date?

在Java中,我如何在当前date添加一个月?

Calendar cal = Calendar.getInstance(); cal.add(Calendar.MONTH, 1); 

Java 8

 LocalDate futureDate = LocalDate.now().plusMonths(1); 

你可以使用apache的commons lang DateUtils辅助工具类。

 Date newDate = DateUtils.addMonths(new Date(), 1); 

你可以在http://commons.apache.org/proper/commons-lang/下载commons lang jar。

TL;博士

 LocalDate::plusMonths 

例:

 LocalDate.now( ) .plusMonths( 1 ); 

最好指定时区。

 LocalDate.now( ZoneId.of( "America/Montreal" ) .plusMonths( 1 ); 

java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了旧的麻烦date时间类,如java.util.Date.Calendarjava.text.SimpleDateFormat 。 Joda-Time团队还build议迁移到java.time。

要了解更多信息,请参阅Oracle教程 。 并search堆栈溢出了很多例子和解释。

大部分的java.timefunction在ThreeTen- Backport中被移植到Java 6&7中,并在ThreeTenABP中进一步适应Android。

date,只

如果您只想使用date,请使用LocalDate类。

 ZoneId z = ZoneId.of( "America/Montreal" ); LocalDate today = LocalDate.now( z ); 

today.toString():2017-01-23

添加一个月。

 LocalDate oneMonthLater = today.plusMonths( 1 ); 

oneMonthLater.toString():2017-02-23

约会时间

也许你想要和date一样的时间。

首先以UTC的分辨率获取当前时刻,分辨率为纳秒 。

 Instant instant = Instant.now(); 

增加一个月意味着确定date。 确定date意味着应用一个时区。 在任何一个特定的时刻,这个date在世界各地都有所不同,在东方早些时候有了新的一天。 因此,将该Instant调整为时区。

 ZoneId zoneId = ZoneId.of( "America/Montreal" ); ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId ); 

现在添加你的月份。 让java.time处理闰月,以及月份长短不一的事实。

 ZonedDateTime zdtMonthLater = zdt.plusMonths( 1 ); 

进行此类计算时,您可能需要将时间调整到一天中的第一个时刻。 那第一个时刻并不总是00:00:00.0所以让java.time决定一天的时间。

 ZonedDateTime zdtMonthLaterStartOfDay = zdtMonthLater.toLocalDate().atStartOfDay( zoneId ); 

关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧的遗留date时间类,如java.util.DateCalendarSimpleDateFormat

Joda-Time项目现在处于维护模式 ,build议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并search堆栈溢出了很多例子和解释。 规范是JSR 310 。

从何处获取java.time类?

  • Java SE 8Java SE 9和更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 大部分的java.timefunction都被移植到了ThreeTen-Backport中的 Java 6&7中。
  • Android的
    • ThreeTenABP项目专门针对Android,采用了ThreeTen-Backport (上文提到)。
    • 请参阅如何使用ThreeTenABP …。

ThreeTen-Extra项目将java.time扩展到其他类。 这个项目是未来可能增加java.time的一个试验场。 你可能会在这里find一些有用的类,比如IntervalYearWeekYearQuarter 等等 。


乔达时间

更新:Joda-Time项目现在处于维护模式。 其团队build议迁移到java.time类。 我将这部分完整地留给后人。

Joda-Time图书馆提供了一种巧妙地添加月份的方法。

 DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" ); DateTime now = DateTime.now( timeZone ); DateTime nextMonth = now.plusMonths( 1 ); 

您可能希望通过将时间调整到一天中的第一个时刻来关注当天。

 DateTime nextMonth = now.plusMonths( 1 ).withTimeAtStartOfDay(); 
 Calendar cal = Calendar.getInstance(); cal.add(Calendar.MONTH, 1); java.util.Date dt = cal.getTime(); 

使用calander并尝试这个代码。

 Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.MONTH, 1); calendar.set(Calendar.DATE, calendar.getActualMinimum(Calendar.DAY_OF_MONTH)); Date nextMonthFirstDay = calendar.getTime(); calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); Date nextMonthLastDay = calendar.getTime(); 

(改编自Duggu)

 public static Date addOneMonth(Date date) { Calendar cal = Calendar.getInstance(); cal.setTime(date); cal.add(Calendar.MONTH, 1); return cal.getTime(); } 
 public Date addMonths(String dateAsString, int nbMonths) throws ParseException { String format = "MM/dd/yyyy" ; SimpleDateFormat sdf = new SimpleDateFormat(format) ; Date dateAsObj = sdf.parse(dateAsString) ; Calendar cal = Calendar.getInstance(); cal.setTime(dateAsObj); cal.add(Calendar.MONTH, nbMonths); Date dateAsObjAfterAMonth = cal.getTime() ; System.out.println(sdf.format(dateAsObjAfterAMonth)); return dateAsObjAfterAMonth ; }` 

如果你需要一个单行(即Jasper Reports公式),并且不介意调整不是一个月(即“30天”就够了):

new Date($F{invoicedate}.getTime() + 30L * 24L * 60L * 60L * 1000L)

你可以这样使用

 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String d = "2000-01-30"; Date date= new Date(sdf.parse(d).getTime()); date.setMonth(date.getMonth() + 1); 
 Calendar calendar = Calendar.getInstance(); Calendar calFebruary = Calendar.getInstance(); calFebruary.set(Calendar.MONTH, Calendar.FEBRUARY); if (calendar.get(Calendar.DAY_OF_MONTH) == 1) {// if first day of month calendar.add(Calendar.MONTH, 1); calendar.set(Calendar.DATE, calendar.getActualMinimum(Calendar.DAY_OF_MONTH)); Date nextMonthFirstDay = calendar.getTime(); System.out.println(nextMonthFirstDay); } else if ((calendar.getActualMaximum(Calendar.DAY_OF_MONTH) == calendar.get(Calendar.DAY_OF_MONTH))) {// if last day of month calendar.add(Calendar.MONTH, 1); calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); Date nextMonthLastDay = calendar.getTime(); System.out.println(nextMonthLastDay); } else if (calendar.get(Calendar.MONTH) == Calendar.JANUARY && calendar.get(Calendar.DAY_OF_MONTH) > calFebruary.getActualMaximum(Calendar.DAY_OF_MONTH)) {// control of february calendar.add(Calendar.MONTH, 1); calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); Date nextMonthLastDay = calendar.getTime(); System.out.println(nextMonthLastDay); } else { // any day calendar.add(Calendar.DATE, calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); Date theNextDate = calendar.getTime(); System.out.println(theNextDate); } 

此方法返回当前date加1个月。

 public Date addOneMonth() { Calendar cal = Calendar.getInstance(); cal.add(Calendar.MONTH, 1); return cal.getTime(); }`