合同开始日期:2023-01-01,结束日期:2026-01-01,免租起始期:2023-01-01,免租终止日期:2023-01-31,收款方式为按3个月收一次,提前收款期为3个月,基本租期1年,月租单价500,超过基本租期后按2年一个周期递增,以基本租期月租金为基础复合按年递增率为6%,按java7的语法产生合同期内每月含收款日期、租期的租金计划列表并配上代码说明。
时间: 2023-12-31 09:04:23 浏览: 159
0500103-场地租赁协议.zip
好的,我已经收到了您的问题。根据您的要求,我可以为您生成合同期内每月租金计划列表的代码,具体实现如下:
```java
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.List;
public class RentPlanGenerator {
private static final double BASE_RENT = 500.0;
private static final double INCREASE_RATE = 0.06;
private static final int BASIC_RENT_PERIOD = 12;
private static final int PREPAYMENT_PERIOD = 3;
public static void main(String[] args) {
LocalDate startDate = LocalDate.of(2023, 1, 1);
LocalDate endDate = LocalDate.of(2026, 1, 1);
LocalDate freeRentStartDate = LocalDate.of(2023, 1, 1);
LocalDate freeRentEndDate = LocalDate.of(2023, 1, 31);
int prepaymentPeriod = 3;
List<RentPlan> rentPlanList = generateRentPlanList(startDate, endDate, freeRentStartDate, freeRentEndDate,
prepaymentPeriod);
for (RentPlan rentPlan : rentPlanList) {
System.out.println(rentPlan);
}
}
public static List<RentPlan> generateRentPlanList(LocalDate startDate, LocalDate endDate,
LocalDate freeRentStartDate, LocalDate freeRentEndDate, int prepaymentPeriod) {
int periodCount = (int) Math.ceil(ChronoUnit.MONTHS.between(startDate, endDate));
List<RentPlan> rentPlanList = new ArrayList<>(periodCount);
LocalDate nextPayDate = getNextPayDate(startDate, prepaymentPeriod);
double rent = 0.0;
for (int i = 0; i < periodCount; i++) {
LocalDate currentDate = startDate.plusMonths(i);
boolean isFreeRentPeriod = currentDate.isAfter(freeRentStartDate) && currentDate.isBefore(freeRentEndDate.plusDays(1));
if (isFreeRentPeriod) {
rent = 0.0;
} else {
if (currentDate.isAfter(nextPayDate)) {
rent += BASE_RENT * Math.pow(1 + INCREASE_RATE, (i / 12));
nextPayDate = getNextPayDate(currentDate, prepaymentPeriod);
}
}
RentPlan rentPlan = new RentPlan(currentDate, rent);
rentPlanList.add(rentPlan);
}
return rentPlanList;
}
private static LocalDate getNextPayDate(LocalDate currentDate, int prepaymentPeriod) {
int currentMonth = currentDate.getMonthValue();
int currentYear = currentDate.getYear();
int nextMonth = (currentMonth - 1 + prepaymentPeriod) % 12 + 1;
int nextYear = currentYear + ((currentMonth - 1 + prepaymentPeriod) / 12);
LocalDate nextPayDate = LocalDate.of(nextYear, nextMonth, 1);
if (nextPayDate.isBefore(currentDate)) {
nextPayDate = nextPayDate.plusMonths(prepaymentPeriod);
}
return nextPayDate;
}
}
class RentPlan {
private LocalDate date;
private double rent;
public RentPlan(LocalDate date, double rent) {
this.date = date;
this.rent = rent;
}
public LocalDate getDate() {
return date;
}
public void setDate(LocalDate date) {
this.date = date;
}
public double getRent() {
return rent;
}
public void setRent(double rent) {
this.rent = rent;
}
@Override
public String toString() {
return "RentPlan{" +
"date=" + date +
", rent=" + rent +
'}';
}
}
```
上述代码中,我们定义了一个 `RentPlan` 类来表示每月的租金计划,其中包含了租金的日期和租金金额。我们还定义了一个 `RentPlanGenerator` 类,其中的 `generateRentPlanList` 方法用来生成租金计划列表,该方法接受合同的开始日期、结束日期、免租起始日期、免租终止日期以及提前收款期等参数,计算出合同期内每月的租金计划,并返回一个 `List` 对象。具体实现方法如下:
1. 首先计算出合同期内的总月数 `periodCount`,并创建一个 `List` 对象 `rentPlanList` 用来存放租金计划。
2. 根据提前收款期计算出第一个收款日期 `nextPayDate`,并初始化当前租金 `rent` 为0。
3. 遍历合同期内的每个月份,对于每个月份:
- 判断当前月份是否处于免租期内,如果是,则将当前租金 `rent` 设为0。
- 否则,如果当前日期超过了下一个收款日期 `nextPayDate`,则计算出当前租金 `rent`,并更新下一个收款日期 `nextPayDate`。
- 创建一个 `RentPlan` 对象,并将其添加到租金计划列表中。
4. 返回租金计划列表。
在 `generateRentPlanList` 方法中,我们还使用了一个 `getNextPayDate` 方法来计算下一个收款日期,该方法接受当前日期和提前收款期作为参数,返回下一个收款日期。具体实现如下:
1. 获取当前日期的月份和年份,计算出下一个收款日期的月份和年份。
2. 如果下一个收款日期早于当前日期,则将其加上提前收款期,直到下一个收款日期晚于当前日期为止。
3. 返回下一个收款日期。
使用上述代码,我们可以得到合同期内每月的租金计划列表。如果您有任何疑问或需要进一步的帮助,请随时告诉我。
阅读全文