【问题标题】:get list of dates which occurs between two dates获取发生在两个日期之间的日期列表
【发布时间】:2014-11-10 19:51:11
【问题描述】:

我正在尝试获取日期,从开始日期到结束日期每 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; 
    }

【问题讨论】:

  • 我的问题清楚了吗?你能明白我在问什么吗?因为仍然没有回复,所以我认为没有人理解我的问题。
  • 您在不到 5 分钟前提出了问题!
  • 您的代码存在很多问题:1) list 被初始化为 ArrayList&lt;Date&gt;,但您将 String 放入其中 2) 当您将 newDatesEndDate 进行比较时正在做 String 比较,而不是 Date 比较
  • 尽可能example

标签: java date


【解决方案1】:

为什么要将日期作为字符串并按字典顺序进行比较,而不是将它们作为日期进行比较?

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;
    }
}    

【讨论】:

  • 我用字符串制作它,因为我需要“MM/DD/YYYY”格式的输出
  • 您可以在进入列表或添加到列表时这样做。
  • endDate 日期我只会以这种格式“MM/DD/YYYY”接收,所以它的字符串。所以我就是这样做的
  • 没关系,请查看并以您的方式尝试(不要盲目复制粘贴此代码),看看这是否有助于您了解问题所在以及如何做得更好。
  • 好的。我更新了上面的代码,但缺少初始日期。输出应该是[Sat Nov 15 00:00:00 IST 2014, Thu Nov 20 00:00:00 IST 2014, Tue Nov 25 00:00:00 IST 2014] 但我的新更新代码只给出[Thu Nov 20 00:00:00 IST 2014, Tue Nov 25 00:00:00 IST 2014] 为什么?
【解决方案2】:

利用 Apache 公共资源DateUtils。这将使您的代码变得简单

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

【讨论】:

    【解决方案3】:

    试试这个

    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);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-10-05
      • 2018-09-17
      • 1970-01-01
      • 1970-01-01
      • 2018-01-11
      • 1970-01-01
      • 2011-02-10
      • 2010-11-25
      • 1970-01-01
      相关资源
      最近更新 更多