尝试使用日历时出现问题。 看:
public static Calendar novaData(Calendar originDate, Integer amountMonth) {
System.out.println("Origin date: " + originDate.getTime() + " - Add " + amountMonth + " Months");
Calendar date = new GregorianCalendar(originDate.getTimeZone());
date.add(Calendar.MONTH, amountMonth);
System.out.println(date.getTime());
return date;
}
在这种方法中,我将设置一个日期以及要添加到该日期的月数。问题就在那里,这一天像今天(18)一样来了,而不是我过去的第一天。预期的结果是五月/ 01/2019-六月/ 01/2019-七月/ 01/2019
答案 0 :(得分:1)
LocalDate originDate = LocalDate.of(2019, Month.MAY, 1);
for (int amountMonth = 1; amountMonth <= 3; amountMonth++) {
System.out.println("Origin date: " + originDate + " - Add " + amountMonth + " Months");
System.out.println(originDate.plusMonths(amountMonth));
}
输出为:
Origin date: 2019-05-01 - Add 1 Months 2019-06-01 Origin date: 2019-05-01 - Add 2 Months 2019-07-01 Origin date: 2019-05-01 - Add 3 Months 2019-08-01
我从您想要的输出中发现,您只对日期感兴趣,而对一天中的时间或时区不感兴趣。如果是这样,则LocalDate
类是要使用的正确类。
如果您只对月份感兴趣,而不对月份中的一天感兴趣,请使用YearMonth
而不是LocalDate
。除了声明和初始化外,代码将相同:
YearMonth originDate = YearMonth.of(2019, Month.MAY);
Origin date: 2019-05 - Add 1 Months 2019-06 (etc.)
请勿使用Calendar
和GregorianCalendar
。这些课程设计欠佳,而且已经过时。最重要的是,它们与每个对象一起携带一天中的某个时间,一个时区,一个星期的计划等等,而我认为这些都不是您所需要的,而这只会冒着使读取代码的人迷惑的风险。
链接: Oracle tutorial: Date Time解释了如何使用java.time。
答案 1 :(得分:0)
首先,如果可能的话,请考虑使用较新的Java Date对象。参见例如this blog。
但是,OP的特定问题是new GregorianCalendar
调用will create based upon the current date/time of the user。它未使用originDate的指定日期/时间。
一种调整代码的方法是:
public static Calendar novaData(Calendar originDate, Integer amountMonth) {
System.out.println("Origin date: " + originDate.getTime() + " - Add " + amountMonth + " Months");
Calendar date = new GregorianCalendar();
date.setTime(originDate.getTime());
date.setTimeZone(originDate.getTimeZone());
date.add(Calendar.MONTH, amountMonth);
System.out.println(date.getTime());
return date;
}
根据测试输入,输出将月份向前移动。 See it here
原定日期:2019年5月18日星期六18:01:21-添加0个月
2019年5月18日星期六18:01:21 GMT
起源日期:2019年5月18日星期六18:01:21 GMT-增加1个月
2019年6月18日星期二18:01:21格林尼治标准时间
起源日期:2019年5月18日星期六格林尼治标准时间18:01:21-增加2个月
2019年7月18日星期四18:01:21 GMT
请注意,leap年,负金额等问题并未得到充分考虑。