在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;
}
答案 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变量month
和day
。
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包还提供了LocalDate
类。代码类似于上面的Joda-Time示例。