Java Joda-Time ,将 LocalDate 分配给 Month 和 Year
Posted
技术标签:
【中文标题】Java Joda-Time ,将 LocalDate 分配给 Month 和 Year【英文标题】:Java Joda-Time , assign LocalDate to Month and Year 【发布时间】:2014-07-12 05:04:57 【问题描述】:我以前从未使用过Joda-Time,但我有 ArrayList,其中包含具有 LocalDate 和计数的对象。所以我在 ArrayList 中计算了每一天,并且每天在 ArrayList 中只有一次。 我需要计算一年中每个月的计数,这在列表中。
我的数据: 例如:
dd.MM.yyyy
17.01.1996 (count 2)
18.01.1996 (count 3)
19.02.1996 (count 4)
19.03.1996 (count 1)
18.05.1997 (count 3)
现在我想要这样的输出:
MM.yyyy
01.1996 -> 2 (17.1.1996) + 3 (18.1.1996) = 5
02.1996 -> 4 (19.2.1996) = 4
03.1996 -> 1 (19.3.1996) = 1
05.1997 -> 3 (18.5.1997) = 3
我只需要统计每个月的数量,但我不知道实现这一目标的最佳方法是什么。
数据类:
private class Info
int count;
LocalDate day;
结果我会放入一些包含月份和年份日期+计数的类。
【问题讨论】:
【参考方案1】:在Joda-Time中,有一个类表示年+月信息,命名为YearMonth
。
您需要做的主要是构造一个Map<YearMonth, int>
来存储每个YearMonth
的计数,通过循环遍历包含LocalDate
和计数的原始List
,并相应地更新映射。
从LocalDate
到YearMonth
的转换应该很简单:YearMonth yearMonth = new YearMonth(someLocalDate);
应该可以工作
在伪代码中,它看起来像:
List<Info> dateCounts = ...;
Map<YearMonth, Integer> monthCounts = new TreeMap<>();
for (Info info : dateCounts)
YearMonth yearMonth = new YearMonth(info.getLocalDate());
if (monthCounts does not contains yearMonth)
monthCounts.put(yearMonth, info.count);
else
oldCount = monthCounts.get(yearMonth);
monthCounts.put(yearMonth, info.count + oldCount);
// feel free to output content of monthCounts now.
// And, with TreeMap, the content of monthCounts are sorted
【讨论】:
谢谢,它应该正常工作。您只是在伪代码 new YearCount(info.getLocalDate()); 中犯了一个小错误。应该是新的 YearMonth (info.getLocalDate()); ,但很容易弄清楚。 @user3658759 大声笑我不知道为什么我在那里写了那个奇怪的类名。现已修复【参考方案2】:您正在寻找 Joda-Time 2.3 中 LocalDate 类的 getMonthOfYear
和 getYear
方法。
for ( Info info : infos )
int year = info.day.getYear();
int month = info.day.getMonthOfYear();
从那里,编写代码以任何适合您的方式汇总计数。您可以保留一张年份地图作为通向月份地图的键。您可以创建一个格式为“YYYY-MM”的字符串作为映射键。
【讨论】:
以上是关于Java Joda-Time ,将 LocalDate 分配给 Month 和 Year的主要内容,如果未能解决你的问题,请参考以下文章
JAVA秒会技术之Joda-Time满足你所有关于日期的处理