Java – 检查数组是否包含3个连续日期

嗨我有一个String []数组,其中包含格式为YYYY / MM / DD的日期。 我想迭代这个数组,看看数组中接下来的2个元素是否包含连续的日期。 如果他们这样做,那么只需增加计数变量。 这是我到目前为止所拥有的。 我基本上需要关于检查是否有3个连续日期的if语句的帮助。

int count = 0; String[] dates = { "2004/1/23", "2004/1/24", "2004/1/25", "2004/1/26", "2004/1/29", "2004/2/11", "2004/2/17", "2004/2/18", "2004/2/18", "2004/3/7"}; for(int i = 0; i < dates.length-2; i++){ //Help needed here! If i, i+1 and i+2 are consecutive... if(...){ count++; } } 

我意识到在比较之前我可能需要将String日期转换为实际的Date对象。 进一步的指导将不胜感激。 谢谢

String[]转换为Date[] (即,准备Date数组)。 我认为你已经知道如何做到这一点。

现在您可以使用以下内容检查连续日期:

 Calendar c = Calendar.getInstance(); int numConsecutive = 0; Date last = null; for (int i = 0; i < dates.length; i++) { c.setTime(dates[i]); c.add(Calendar.DATE, -1); if (c.getTime().equals(last)) { numConsecutive++; } else { numConsecutive = 0; } if (numConsecutive == 2) { numConsecutive = 0; count++; } last = dates[i]; } 

TL;博士

使用java.time.LocalDate类。

 if ( z.minusDays ( 1 ).isEqual ( y ) && z.minusDays ( 2 ).isEqual ( x ) ) … 

使用java.time

现代方法使用java.time类而不是麻烦的旧遗留类DateCalendar

首先将数组转换为LocalDate对象列表。 我更改了你的示例数据,因为我认为你的意思是2月18日和19日而不是重复18次两次。

 String[] dates = { "2004/1/23" , "2004/1/24" , "2004/1/25" , "2004/1/26" , "2004/1/29" , "2004/2/11" , "2004/2/17" , "2004/2/18" , "2004/2/19" , "2004/3/7" }; DateTimeFormatter f = DateTimeFormatter.ofPattern ( "uuuu/M/d" ); List < LocalDate > localdates = new ArrayList <> ( dates.length ); for ( String input : dates ) { LocalDate ld = LocalDate.parse ( input, f ); localdates.add ( ld ); } 

循环LocalDate列表,记住前两个项目。 如果当前和前两个都是连续日期,则递增计数器。

 Integer tripletCount = 0; List< LocalDate > tripletDates = new ArrayList<>(); LocalDate x = null; LocalDate y = null; for ( LocalDate z : localdates ) { if ( null == x ) { x = z; continue; } if ( null == y ) { y = z; continue; } if ( z.minusDays ( 1 ).isEqual ( y ) && z.minusDays ( 2 ).isEqual ( x ) ) { tripletCount= ( tripletCount + 1 ); tripletDates.add( z ); } // Prepare for next loop. x = y ; y = z ; } 

转储到控制台。

 System.out.println ( "localdates: " + localdates ); System.out.println ( "tripletCount: " + tripletCount ); System.out.println ( "tripletDates: " + tripletDates ); 

localdates:[2004-01-23,2004-01-24,2004-01-25,2004-01-26,2004-01-29,2004-02-11,2004-02-17,2004-02-18 ,2004-02-19,2004-03-07]

tripletCount:3

三联日期:[2004-01-25,2004-01-26,2004-02-19]


关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

从哪里获取java.time类?

  • Java SE 8Java SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
    • 请参见如何使用ThreeTenABP ….

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如IntervalYearWeekYearQuarter等。

您好,您需要计算两个日期之间的秒数,然后转换为天数:

 import java.util.*; class DateDiff { public static void main(String [] args) { Calendar c1=Calendar.getInstance(); c1.set(2011,5, 29 ); Calendar c2=Calendar.getInstance(); c2.set(2012,5,30); Date d1=c1.getTime(); Date d2=c2.getTime(); long diff=d2.getTime()-d1.getTime(); int noofdays=(int)(diff/(1000*24*60*60)); System.out.println(noofdays); } } 
 @Test public void threeConsecutiveDates() throws ParseException { List consecutive = new ArrayList<>(); consecutive.add(new Date(0)); final SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd"); String[] dates = { "2004/1/23", "2004/1/24", "2004/1/25", "2004/1/26", "2004/1/29", "2004/2/11", "2004/2/17", "2004/2/18", "2004/2/18", "2004/3/7"}; for (String s : dates) { Date previous = consecutive.get(consecutive.size()-1); Date current = format.parse(s); if(previous.before(current) && (current.getTime()-previous.getTime() == 1000 * 60 * 60 * 24)) { consecutive.add(current); } else { consecutive.clear(); consecutive.add(current); } if(consecutive.size() == 3) { break; } } System.out.println("consecutive = " + consecutive); }