-3

我在一个集成环境(IBM Process Server)中工作,我无法导入任何东西,只能使用标准的 java 功能。

如何在给定日期添加 x 个月?

4

4 回答 4

2

假设您默认导入了日期,您可以通过以下方式向日期对象添加月份数:

public void addMonths(Date date, int numMonths){
    date.setMonth((date.getMonth() - 1 + numMonths) % 12 + 1);
}

笔记

您可以通过使用它们的完整包名来使用 Java SE 中的外部类。即,即使您无法添加import java.util.Calendar;到文件的顶部.java,您仍然可以通过执行创建日历对象java.util.Calendar cal = java.util.Calendar.getInstance();

于 2012-07-20T17:07:19.160 回答
0

如果您想在不使用日历的情况下实现,请使用 @ewok 建议,如果使用不推荐使用的方法出现问题,请使用以下代码:

SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd");  //Date format
    SimpleDateFormat dt = new SimpleDateFormat("MM");
    Date date = dt1.parse("2013-12-31");
    int dm=0;
    int m = Integer.parseInt(dt.format(date));
    switch(m){
        case 2:
            m = 27;
        break;
        case 4:
        case 6:
        case 9:
        case 11:
            m = 29;
        break;
        default:
            m = 30;
        break;
    }// Closing switch block
    long month = Math.round(1000*60*60*24.25*m);
    long oneMonthTime =  date.getTime()+month;
    System.out.println(dt1.format(oneMonthTime));

此代码不适用于闰年。我知道它不完美但仍然可以工作的代码。

于 2013-10-09T12:38:42.893 回答
0

@ewok 的答案在超过年底时并不总是有效,只有numMonths设置为低于或等于到明年一月的月份的值

SSCCE:

public static  void main(String[] args) {
  for(int i=0;i<10; i++) {
    Date date = new Date();
    Date updated = (Date)date.clone();
    addMonths(updated, i);
    System.out.println(" original: " + date+  " adding " +i+ " months: " + updated);
  }
}

public static void addMonths(Date date, int numMonths){
  date.setMonth((date.getMonth() - 1 + numMonths) % 12 + 1);
}

输出:

original: Sat Aug 24 14:02:17 CEST 2013 adding 0 months: Sat Aug 24 14:02:17 CEST 2013
original: Sat Aug 24 14:02:17 CEST 2013 adding 1 months: Tue Sep 24 14:02:17 CEST 2013
original: Sat Aug 24 14:02:17 CEST 2013 adding 2 months: Thu Oct 24 14:02:17 CEST 2013
original: Sat Aug 24 14:02:17 CEST 2013 adding 3 months: Sun Nov 24 14:02:17 CET 2013
original: Sat Aug 24 14:02:17 CEST 2013 adding 4 months: Tue Dec 24 14:02:17 CET 2013
original: Sat Aug 24 14:02:17 CEST 2013 adding 5 months: Fri Jan 24 14:02:17 CET 2014
original: Sat Aug 24 14:02:17 CEST 2013 adding 6 months: Sun Feb 24 14:02:17 CET 2013
original: Sat Aug 24 14:02:17 CEST 2013 adding 7 months: Sun Mar 24 14:02:17 CET 2013
original: Sat Aug 24 14:02:17 CEST 2013 adding 8 months: Wed Apr 24 14:02:17 CEST 2013
original: Sat Aug 24 14:02:17 CEST 2013 adding 9 months: Fri May 24 14:02:17 CEST 2013

请注意,二月、三月等日期早在 2013 年!由于奇怪的算术,代码存在缺陷...... setMonth 也处理 > 12 的值......

已更正(尽管仍在使用已弃用的方法...):

      date.setMonth((date.getMonth() + numMonths) );

输出:

original: Sat Aug 24 14:13:09 CEST 2013 adding 0 months: Sat Aug 24 14:13:09 CEST 2013
original: Sat Aug 24 14:13:09 CEST 2013 adding 1 months: Tue Sep 24 14:13:09 CEST 2013
original: Sat Aug 24 14:13:09 CEST 2013 adding 2 months: Thu Oct 24 14:13:09 CEST 2013
original: Sat Aug 24 14:13:09 CEST 2013 adding 3 months: Sun Nov 24 14:13:09 CET 2013
original: Sat Aug 24 14:13:09 CEST 2013 adding 4 months: Tue Dec 24 14:13:09 CET 2013
original: Sat Aug 24 14:13:09 CEST 2013 adding 5 months: Fri Jan 24 14:13:09 CET 2014
original: Sat Aug 24 14:13:09 CEST 2013 adding 6 months: Mon Feb 24 14:13:09 CET 2014
original: Sat Aug 24 14:13:09 CEST 2013 adding 7 months: Mon Mar 24 14:13:09 CET 2014
original: Sat Aug 24 14:13:09 CEST 2013 adding 8 months: Thu Apr 24 14:13:09 CEST 2014
original: Sat Aug 24 14:13:09 CEST 2013 adding 9 months: Sat May 24 14:13:09 CEST 2014

需要考虑的事项

  • 几个月的最后几天,来自 setMonth() 的 Java 文档:

    将此日期的月份设置为指定值。修改此 Date 对象,使其表示指定月份内的一个时间点,其中年、日期、小时、分钟和秒与以前相同,以本地时区解释。例如,如果日期是 10 月 31 日,并且月份设置为 6 月,那么新日期将被视为 7 月 1 日,因为 6 月只有 30 天。

  • 仍然不推荐使用 - 但是正确解决问题会非常耗时(例外情况,闰日,闰秒等),更不用说彻底改造轮子......也许将日历修剪到最低限度,并将其粘贴到代码会解决它 - 但即使这样也不值得麻烦......

  • 绝对应该尝试@ewok 建议的第二种方法,即完全限定的类名。

于 2013-08-24T12:24:15.783 回答
-1
于 2018-01-31T06:36:37.260 回答