生成日期范围 - 需要有关代码改进的建议

时间:2012-01-22 17:23:38

标签: java algorithm datetime jodatime

我正在生成两个日期之间的所有日期。

public List<Date> generateRangeDates(Date firstDate, Date lastDate) {
    List<Date> allDates = new ArrayList<Date>();
    Calendar calendar = new GregorianCalendar();

    calendar.setTime(firstDate);

    while (calendar.getTime().before(lastDate)) {
        Date resultado = calendar.getTime();
        allDates .add(resultado);
        calendar.add(Calendar.DATE, 1);
    }

    Date lastDate1 = allDates .get(dates.size()-1);
    Calendar cal = new GregorianCalendar();
    cal.setTime(lastDate1);
    cal.add(Calendar.DATE, 1);
    allDates .add(cal.getTime());

    for(Date date1 : dates) {
        System.out.println("All Dates : "+ date1);
    }

    return dates;
}

以上方法生成从第一个日期到最后一个日期的所有日期。我知道它有一个很大的缺点。就像我可以使用joda-time而不是java.util.Calendar。关于夏令时也存在模糊之处。它也没有提及TIMEZONE。还使用GregorianCalendar,它完全忽略了当前的Locale。 - 暂时 - 我不想使用JODA API。

帮助需要更新适用于所有TIMEZONES的上述功能。我在谷歌上搜索了很多,但也很困惑。

也是一个问题(可能听起来有点愚蠢) - 为什么人们坚持使用JODA API?它有什么含糊之处吗?

注意 - 这些行生成最后一个日期并添加到allDates列表中。

Date lastDate1 = allDates .get(dates.size()-1);
Calendar cal = new GregorianCalendar();
cal.setTime(lastDate1);
cal.add(Calendar.DATE, 1);
allDates .add(cal.getTime());

1 个答案:

答案 0 :(得分:2)

有没有理由暂时不使用long?如果你需要使用日期,你可以这样做。

日期与时区无关。

 public List<Date> generateRangeDates(Date firstDate, Date lastDate) {
      List<Date> dates = new ArrayList<Date>();
      for(long t = firstDate.getTime(); t <= lastDate.getTime(); t += 24 * 60 * 60 * 1000)
          dates.add(new Date(t));
      return dates;
 }

您无法创建一个完全独立于TimeZone的列表,因为Java中没有这样的数据结构。

其他人可能建议使用JODA的原因是它具有正确的日期(没有时间)对象,因为它与时区无关。