有没有一种方法可以将日期和每日价值的总和划分为几个月?

时间:2020-01-19 14:55:13

标签: java date mapping

我在想一种方法来创建函数,该函数可以计算系统中所有组合项目的月支出并返回以月为键并以月支出为价值的地图。所谓每月支出,是指员工的工作时间乘以他们的工资。

Project类具有一个开始日期和一个结束日期,其功能可以计算介于两者之间的工作日。每个项目的开始和结束日期都不同。

public int getNumWorkingDays() {
    return utils.Calendar.getNumWorkingDays(this.startDate, this.endDate);
}

该项目还有一个commitHoursPerDay()函数,可将员工映射到每天的工作时间。

private Map<Employee,Integer> committedHoursPerDay;

我该如何创建一个函数来总结每个月的支出情况,并牢记每个项目的开始和结束日期?

Map<Month,Integer> monthlyBudget;

1 个答案:

答案 0 :(得分:3)

我当然不会为您做编程工作,但是我可以给您一些考虑事项。

YearMonth

要表示一个月,请使用YearMonth类。

YearMonth yearMonth = YearMonth.of( 2020 , Month.JANUARY ) ;

您可以在任何日期获得YearMonth

LocalDate ld = LocalDate.of( 2020 , Month.MARCH , 27 ) ;
YearMonth yearMonth = YearMonth.from( ld ) ;

该类可以用作地图的键。至于地图的key-value配对的值部分,如果您谈论的是小数货币金额,请对BigDecimal使用accuracy,而不要使用floating-point类型,浮点或

Map< YearMonth , BigDecimal > monthlyTotals = new TreeMap<> () ;

Map实现

对于要选择的Map实现,您可能想要一种按时间顺序将这些YearMonth对象的键保持不变的键。如果是这样,请选择一个实现NavigableMap的对象。 Java 11捆绑了两个这样的实现:TreeSetConcurrentSkipListMap。如果要跨线程处理地图,请使用第二个。

这是我制作的一张表格,总结了与Java 11捆绑在一起的各种地图实现的功能。

Table of map implementations in Java 11, comparing their features

经过的天数

Project类具有一个开始日期和一个结束日期,其功能可以计算其之间的工作日

使用ChronoUnit类来计算经过的天数。使用半开方法,其中开头为包含,而结尾为排除

LocalDate start = LocalDate.of( 2020 , Month.JANUARY , 23 ) ;
LocalDate stop = LocalDate.of( 2020 , Month.FEBRUARY , 15 ) ;
long days = ChronoUnit.DAYS.between( start , stop ) ;

如果您想省略一周中的某些天只计算“工作日”,那么search Stack Overflow可以了解更多信息,因为这已经涉及很多次了。您可能需要查看 ThreeTen-Extra 库中的时间调节器。