部分日期(月和日)的实例出现在一个范围内,以及一周中的哪一天

时间:2014-12-15 14:23:37

标签: java datetime jodatime

在Java中,我将如何构建一个实用程序,该实用程序将采用一系列日期(开始日期和结束日期),然后查看给定部分日期(月份和日期)出现的次数。该范围,并将为每个匹配添加一个列表条目。

在我的例子中,我想给它一个5年的范围 - 从2014年1月1日开始到2019年12月31日。我的检查日期是8月2日。我希望该方法返回该范围内任何一年8月2日的每场比赛的完整信息。因此2014年将于2014年8月2日星期六,2015年8月2日星期日等返回,等等。

到目前为止,我一直在尝试使用Joda Time和Java中的默认日期/日历类来完成工作,而我只是让自己陷入混乱。

谢谢, 小号

编辑:我多么愚蠢,为不添加我的代码道歉:(

public static List<Date> getDaysInRange(Date startdate,
                                      Date enddate,
                                      Date checkDate) {
   SimpleDateFormat sdf = new SimpleDateFormat("MMdd");
   List<Date> dates = new ArrayList<>();
   Calendar cal = new GregorianCalendar();
   cal.setTime(startdate);

   while (cal.getTime().before(enddate)) {
      if (sdf.format(cal.getTime()).equals(sdf.format(checkDate))) {
        Date result = cal.getTime();
        dates.add(result);
      }
      cal.add(Calendar.DATE, 1);
   }
  return dates;
}

2 个答案:

答案 0 :(得分:0)

我认为使用SimpleDateFormat是个坏主意。直接使用日历进行比较,例如

cal1.get(Calendar.MONTH) == cal2.get(Calendar.MONTH) && cal1.get(Calendar.DAY_OF_MONTH) == cal2.get(Calendar.DAY_OF_MONTH)

答案 1 :(得分:0)

日期 - 仅

由于您只想要一个没有时间且没有时区的日期,因此请使用仅限日期的课程。旧的java.util.Date/.Calendar类缺少这样的类。而那些古老的课程出了名的麻烦和缺陷。

而是使用:

约达时间

这是使用Joda-Time 2.6的一些未经测试的代码。

主要思想是关注一小部分可能的年份数,而不是每年的每一天都进行测试。在下面的示例中,这意味着要比较六个日期时间值而不是数千个。除了效率之外,代码的目的也变得更加明显。

您的例行程序的参数应该是月份编号和日期编号,一对整数或整数,而不是日期。如本例中所示,两个int变量monthday

LocalDate start = new LocalDate( 2011, 2, 3 );
LocalDate stop = new LocalDate( 2016, 4, 5 );
int yearStart = start.getYear();
int yearStop = stop.getYear();
int month = 11;
int day = 22;

for ( i = yearStart, i <= yearStop, i++ ) 
{
    LocalDate x = new LocalDate( i, month, day );
    boolean matchStart = ( x.isEqual( start ) || x.isAfter( start ) );
    boolean matchStop = x.isBefore( stop ); // Half-Open approach where beginning of range is inclusive while ending is exclusive.
    if ( matchStart && matchStop ) 
    {
        // Add to collection of LocalDate objects.
        // Later you can ask each LocalDate object for its day-of-week.
    {
}

java.time

java.time包还提供了LocalDate类。代码类似于上面的Joda-Time示例。