您好我有一个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对象。进一步的指导将不胜感激。感谢
答案 0 :(得分:3)
将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];
}
答案 1 :(得分:1)
使用java.time.LocalDate
类。
if ( z.minusDays ( 1 ).isEqual ( y ) && z.minusDays ( 2 ).isEqual ( x ) ) …
现代方法使用java.time类而不是麻烦的旧遗留类Date
&amp; Calendar
。
首先将数组转换为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
tripletDates:[2004-01-25,2004-01-26,2004-02-19]
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和&amp; SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 2 :(得分:0)
您好,您需要计算两个日期之间的秒数,然后转换为天数:
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);
}
}
答案 3 :(得分:0)
@Test
public void threeConsecutiveDates() throws ParseException {
List<Date> 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);
}