2014-09-10 186 views
0

我需要一个采用整数输入(N)并返回接下来N天的生日的方法。我发现运行代码非常困难。以下仅仅是我希望如何工作的代码 - 它绝不是一个可用的代码。任何帮助,高度赞赏。计算未来N天即将到来的生日的方法

/* print out all the birthdays in the next N days */ 
public void show(int N){ 
    Calendar cal = Calendar.getInstance(); 
    Date today = cal.getTime(); 

    // birthdayList is the list containing a list 
    // of birthdays Format: 12/10/1964 (MM/DD/YYYY) 

    for(int i = 0; i<birthdayList.getSize(); i++){ 
     if(birthdayList[i].getTime()- today.getTime()/(1000 * 60 * 60 * 24) == N)){ 
      System.out.println(birthdayList[i]); 
     } 
    } 

} 
+1

第一个端口 - 如果可以的话放弃java.util.Date和java.util.Calendar。你可以使用Java 8的'java.time'包还是Joda Time? – 2014-09-10 14:00:22

+0

birthdayList - 它是否包含字符串或日期? – 2014-09-10 14:01:39

+0

使用Java Instant它有isBefore和isAfter方法来封装你的日期。 – StackFlowed 2014-09-10 14:09:14

回答

1
Calendar calendar = Calendar.getInstance(Locale.ENGLISH); 
calendar.setTime(new Date()); 
calendar.add(Calendar.DATE, n); // n is the number of days upto which to be calculated 
Date futureDate = calendar.getTime(); 
List<String> listOfDates = returnListOfDatesBetweenTwoDates(new Date() 
                   , futureDate); 

其中

public static List<String> returnListOfDatesBetweenTwoDates(java.util.Date fromDate, 
                  java.util.Date toDate) { 
    List<String> listOfDates = Lists.newArrayList(); 
    Calendar startCal = Calendar.getInstance(Locale.ENGLISH); 
    startCal.setTime(fromDate); 
    Calendar endCal = Calendar.getInstance(Locale.ENGLISH); 
    endCal.setTime(toDate); 
    while (startCal.getTimeInMillis() <= endCal.getTimeInMillis()){ 
     java.util.Date date = startCal.getTime(); 
     listOfDates.add(new SimpleDateFormat("dd-MM-yyyy" 
               , Locale.ENGLISH).format(date).trim()); 
     startCal.add(Calendar.DATE, 1); 
    } 
    return listOfDates; 
} 

现在,随着日期的是你的生日列表比较日期的列表和相应的工作

1

搜索StackOverflow的

简要回答,因为这方面的工作已经在StackOverflow上解决了数百次(如果不是数千次)。请搜索StackOverflow了解更多信息。搜索“joda”和“半开放”,也许“不可变”。显然,搜索下面示例代码中看到的类和方法名称。

避免java.util.Date & .Calendar

避免与Java捆绑java.util.Date和.Calendar类。他们是非常麻烦的。请使用乔达时间或新java.time包中的Java 8

乔达时间

假设你的列表中包含java.util.Date对象,将它们转换为乔达时间DateTime对象。

// birthDates is a list of java.util.Date objects. 
DateTimeZone timeZone = DateTimeZone.forID("America/Montreal"); 
DateTime now = DateTime.now(timeZone); 
Interval future = new Interval(now, now.plusDays(90).withTimeAtStartOfDay()); // Or perhaps .plusMonths(3) depending on your business rules. 
List<DateTime> list = new ArrayList<>(); 
for(java.util.Date date : birthDates) { 
    DateTime dateTime = new DateTime(date, timeZone); // Convert from java.util.Date to Joda-Time DateTime. 
    If(future.contains(dateTime)) { 
     list.add(dateTime); 
    } 
}