我正在研究一个java组件,该组件使用日期窗口标记事件,以按天,周,月等汇总度量标准。
从日期到其聚合类别的映射很简单 - 只需使用适当的模式为所需窗口格式化为String
。例如,可以使用Formatter
pattern "%1$04tY-%1$02tm"
(即 YYYY-MM
)将日期映射到月级聚合。
我的问题是从窗口到其边界日期的反向映射,例如从汇总的月份2012-02
到其边界日期2012-02-01
和2012-03-01
(使用半开的时间间隔)。我需要这个用一个语句有效地标记我的数据存储(MongoDB)中的整个日期范围(为了清楚起见,此示例省略了ISODate(…)
):
db['events'].update(
{eventDate: {$gte: "2012-02-01", $lt: "2012-03-01"},
{$set: {month: "2012-02"}
);
答案 0 :(得分:1)
Joda-Time绝对是最佳选择。
根据您对TimeZones的处理方式,以下显示了我认为您想要的内容。
YearMonth ym = new YearMonth(2012, DateTimeConstants.MARCH);
Interval interval = ym.toInterval();
LocalDate monthStart = interval.getStart().toLocalDate();
LocalDate monthEnd = interval.getEnd().toLocalDate();
System.out.println("Start:" + monthStart);
System.out.println("End: " + monthEnd);
注意:这至少需要Joda-Time v2.0
答案 1 :(得分:0)
我建议使用http://joda-time.sourceforge.net/api-release/org/joda/time/LocalDate.html
您可以通过从窗口解析年份和月份来构建下限, 然后
LocalDate lowerBound = new LocalDate(year, month, 1)
然后,上限是
LocalDate upperBound = lowerBound.plusMonths(1)