我正在开发一个项目,它将在日期之间进行数千次比较,看看它们是否在同一个月,我想知道最有效的方法是什么。
这不完全是我的代码的样子,但这里是要点:
List<Date> dates = getABunchOfDates();
Calendar month = Calendar.getInstance();
for(int i = 0; i < numMonths; i++)
{
for(Date date : dates)
{
if(sameMonth(month, date)
.. doSomething
}
month.add(Calendar.MONTH, -1);
}
为每个日期创建一个新的Calendar
对象似乎是一个相当大的开销,当这种比较将发生数千次时,所以我有点想作弊并使用弃用的方法Date.getMonth()
和{ {1}}
Date.getYear()
我非常接近使用这种方法,因为它似乎是最快的,但有更快的方式吗?而这是一种愚蠢的方式,因为public static boolean sameMonth(Calendar month, Date date)
{
return month.get(Calendar.YEAR) == date.getYear() && month.get(Calendar.MONTH) == date.getMonth();
}
方法已被弃用?注意:此项目将始终使用Java 7
答案 0 :(得分:2)
我无法评论是否使用已弃用的方法,但如果您选择不使用,则无需为每个Calendar
实例化新的Date
。只需使用另一个Calendar
并在检查前调用setTime(date)
(如果并行化,则为每个线程调用一个Calendar
。)
作为旁注,我必须同意ChristopheD的评论,即这是一个值得数据库的东西。
答案 1 :(得分:0)
我认为您可以定义静态DateFormat
以从Date
中提取月份和年份,并将这两个对象仅用作日期。
public static DateFormat formatter= new SimpleDateForm("MMyyyy");
public static boolean sameMonth(Date date1, Date date2)
{
return formatter.format(date1).equals(formatter.format(date2));
}