我在一个集成环境(IBM Process Server)中工作,我无法导入任何东西,只能使用标准的 java 功能。
如何在给定日期添加 x 个月?
我在一个集成环境(IBM Process Server)中工作,我无法导入任何东西,只能使用标准的 java 功能。
如何在给定日期添加 x 个月?
假设您默认导入了日期,您可以通过以下方式向日期对象添加月份数:
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();
如果您想在不使用日历的情况下实现,请使用 @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));
此代码不适用于闰年。我知道它不完美但仍然可以工作的代码。
@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 建议的第二种方法,即完全限定的类名。