簡體   English   中英

獲取兩個日期之間發生的日期列表

[英]get list of dates which occurs between two dates

我正在嘗試獲取日期,該日期從開始日期到結束日期每隔5天出現一次。

Eg.
if start date= 11/10/2014   i.e  MM/DD/YYYY format
and  end date =11/26/2014

then my **expected output** is =
 [11/15/2014,11/20/2014,11/25/2014]

我在下面嘗試過,但是很困惑在哪里運行循環以獲取准確的輸出。 目前從下面的代碼我只在列表中獲得1日期

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date; 
import java.util.List; 


public class TestDate {
        //     mm/dd/yyyy
    public List getDates(Date fromDate,int frequency,Date endDate){
        List list=new ArrayList<Date>();
        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");


        Calendar c = Calendar.getInstance();
        c.setTime(fromDate); // Now use today date. 
        c.add(Calendar.DATE, frequency); // Adding 5 days  
        String newDate = sdf.format(c.getTime());
         String sEndDate=sdf.format(endDate);

        if((newDate.compareTo(sEndDate) < 0) || (newDate.compareTo(sEndDate) == 0)){
            list.add(newDate); 
        }

        //Weekly=7,Bi-Weekly14,Monthly-30,Semi-Monthly-15 
        return list; 
    }
    public static void main(String[] args) {
        try {
        TestDate obj=new TestDate();
        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
        Date s = sdf.parse("11/10/2014");
        Date e = sdf.parse("11/26/2014");
        System.out.println(obj.getDates(s, 5, e));
        }
        catch(Exception e) { 
            System.err.println("--exp in main---"+e);   
        }
    }
}

正確答案如下 *Thanks to Almas*

public List getDates(Date fromDate,int frequency,Date e){
        List list=new ArrayList<Date>(); 
        Calendar c = Calendar.getInstance();
        Calendar c2 = Calendar.getInstance();
        c2.setTime(e); // Now use today date.  
         Date endDate=c2.getTime();   
        Date newDate=fromDate;
        while(true){
            c.add(Calendar.DATE, frequency);
            newDate=c.getTime();

            if(newDate.compareTo(endDate)<=0){
                list.add(newDate);
            }else{
                break;
            }
        } 
        //Weekly=7,Bi-Weekly14,Monthly-30,Semi-Monthly-15 
        return list; 
    }

為什么要讓日期作為字符串並按字典順序進行比較,而不是將它們作為日期進行比較?

String newDate = sdf.format(c.getTime());
String sEndDate=sdf.format(endDate);

這應該更改為

 Date newDate = c.getTime();

另外,您正在使用兩個if條件,可以按如下所示進行操作:

if (newDate.compareTo(endDate) <= 0) {
    list.add(newDate);
}

就循環而言,您應該在getDates方法中執行以下操作:

Date newDate;
while (true) {
    c.add(Calendar.DATE, frequency); // Adding 5 days
    newDate = c.getTime();

    if (newDate.compareTo(endDate) <= 0) {
        list.add(newDate);
    } else {
        break;
    }
}    

利用Apache Commons DateUtils 這將使您的代碼簡單

    Date tempDate = DateUtils.addDays(fromDate, frequency);
    while (tempDate.before(endDate))
    {
        list.add(tempDate);
        tempDate = DateUtils.addDays(tempDate, frequency);
    }
    return list; 

試試這個

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

public class NewClass1 {
    //     mm/dd/yyyy

    public List getDates(Date fromDate, int frequency, Date endDate) {
        List list = new ArrayList<Date>();
        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");


        Calendar c = Calendar.getInstance();
        c.setTime(fromDate); // Now use today date.
        c.add(Calendar.DATE, frequency); // Adding 5 days
        String newDate = sdf.format(c.getTime());
        //System.out.println("date"+newDate);
        String formDate = sdf.format(fromDate);
        String sEndDate = sdf.format(endDate);
        int x = 1;
        while (((newDate.compareTo(sEndDate) > 0) || (newDate.compareTo(sEndDate) != 0)) && x < frequency) {
            c.add(Calendar.DATE, frequency);
            sEndDate = sdf.format(c.getTime());
            x++;
            System.out.println("date: " + sEndDate);
            list.add(newDate);
        }

        //Weekly=7,Bi-Weekly14,Monthly-30,Semi-Monthly-15
        return list;
    }

    public static void main(String[] args) {
        try {
            NewClass1 obj = new NewClass1();
            SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
            Date s = sdf.parse("11/10/2014");
            Date e = sdf.parse("11/26/2014");
            obj.getDates(s, 5, e);
        } catch (Exception e) {
            System.err.println("--exp in main---" + e);
        }
    }
}

在您的代碼中,您僅調用

 list.add(...);

一旦。

您需要一個(while / for)循環來獲得預期的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM