如何在Java中向当前日期添加一个月?


Answers:


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

thanx piyush,以及这个校准日期格式是什么,我需要将其存储在mysql中
kiran

日期的mysql数据类型为DATETIME。
kiran

是cal返回的正确的日期格式吗,我可以用来存储在mysql中
kiran

1
以所需格式将一个月添加到当前日期的Java代码如下所示。现在,由您决定将此String转换为日期并插入MYSql数据库。请注意,您可以使用STR_TO_DATE(str,format)函数在DateFormat构造函数中或以后在MYSQL查询中更改日期格式。DateFormat formatter = new SimpleDateFormat(“ yyyy-MM-dd hh:mm:ss”); 现在的日历= Calendar.getInstance(); now.add(Calendar.MONTH,1); 字符串dateString = formatter.format(now.getTime());
Piyush Mattoo


49

Java 8

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

1
有java.util.Date:Date.from((LocalDate.now()plusMonths(1))atStartOfDay()atZone(ZoneId.systemDefault())toInstant()。。)
伊斯梅尔Yavuz的


29

tl; dr

LocalDate::plusMonths

例:

LocalDate.now( )
         .plusMonths( 1 );

最好指定时区。

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

java.time

java.time框架是建立在Java 8和更高版本。这些类取代旧的麻烦日期时间类,如java.util.Date.Calendar,和java.text.SimpleDateFormat。该乔达时球队还建议迁移java.time。

要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。

多的java.time功能后移植到Java 6和7在ThreeTen-反向移植和在进一步适于到Android ThreeTenABP

仅日期

如果只想使用日期,请使用LocalDate该类。

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

today.toString():2017年1月23日

加一个月。

LocalDate oneMonthLater = today.plusMonths( 1 );

oneMonthLater.toString():2017-02-23

约会时间

也许您想要日期和时间。

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

Instant instant = Instant.now();

添加一个月意味着确定日期。确定日期意味着应用时区。在任何给定的时刻,日期在世界各地都会有所不同,新的天要早到东方。因此,Instant将其调整为一个时区。

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

现在添加您的月份。让java.time处理Le月,以及月的长度不同的事实。

ZonedDateTime zdtMonthLater = zdt.plusMonths( 1 );

进行这种计算时,您可能需要将时间调整为一天的第一时刻。第一时刻并不总是00:00:00.0如此,因此让java.time确定一天中的时间。

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

关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.DateCalendar,和SimpleDateFormat

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

要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

在哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time。该项目为将来可能在java.time中添加内容打下了基础。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多


乔达时代

更新:Joda-Time项目现在处于维护模式。其团队建议迁移到java.time类。我保留此部分以供后代使用。

乔达时库提供以智能方式添加个月的方法。

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

您可能需要通过将时间调整为一天的第一时刻来集中精力于一天。

DateTime nextMonth = now.plusMonths( 1 ).withTimeAtStartOfDay();

12
Calendar cal = Calendar.getInstance(); 
cal.add(Calendar.MONTH, 1);
java.util.Date dt = cal.getTime();

6

(改编自Duggu)

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

6

使用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();

5
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 ;
}`

您能否提供一些有关代码功能的解释,而不仅仅是一个大的代码块?
Necoras

我的代码更具限制性和通用性。由于它只处理固定格式“ MM / dd / yyyy”的日期(以字符串形式),因此更具恢复性。通用,因为它使您可以在指定的日期添加正月中的任何一个。
DJAMSilvèreGatien

因此,如果必须使用较少限制的代码,则可以在添加一个月后使用任何java.util.Date并呈现另一个java.util.Date,请参见下文:Calendar cal = Calendar.getInstance(); cal.setTime(date); cal.add(Calendar.MONTH,1); cal.getTime();
DJAMSilvèreGatien'Apr

3

您可以在org.apache.commons.lang3.time包中使用DateUtils类

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

简单易用的解决方案。
Royal.O

2

如果您需要单线(例如Jasper Reports公式)并且不介意调整不完全是一个月(即“ 30天”就足够了):

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


不要忘记在数字后加上'L'后缀,否则将被视为简单的int并溢出到负数!
Nicolas Buquet

1

您可以这样使用;

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

*不推荐使用,从JDK 1.1版开始,*由<code> Calendar.set(Calendar.MONTH,int month)</ code>代替。如Date.java所说。
Jasper Lankhorst '18

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

仅供参考,非常麻烦的日期,时间类,如java.util.Datejava.util.Calendarjava.text.SimpleDateFormat现在的遗产,由取代java.time内置到Java 8和更高等级。请参见Oracle教程
罗勒·布尔克


0
    Date dateAfterOneMonth = new DateTime(System.currentTimeMillis()).plusMonths(1).toDate();

-3
public class StringSplit {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        date(5, 3);
        date(5, 4);
    }

    public static String date(int month, int week) {
        LocalDate futureDate = LocalDate.now().plusMonths(month).plusWeeks(week);
        String Fudate = futureDate.toString();
        String[] arr = Fudate.split("-", 3);
        String a1 = arr[0];
        String a2 = arr[1];
        String a3 = arr[2];
        String date = a3 + "/" + a2 + "/" + a1;
        System.out.println(date);
        return date;
    }
}

输出:

10/03/2020
17/03/2020

1
首先,基于OP,答案是错误的。第二,OP在8(!)年前得到了答复,第三,格式化日期输出的方法比使用字符串加载更好。
Markus Deibel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.