Java 根据给定的频率将日期分成相等的间隔

Java 根据给定的频率将日期分成相等的间隔,java,apex,Java,Apex,我试着把一系列的日期分成相等的间隔。这是我正在使用的代码。(日期为YYYY-MM-dd格式) 在我的例子中,我希望以相等的间隔(每月以开始日期为一天)生成日期。在上面的例子中,我应该得到4个相等间隔的结果日期(正如我在几个月内给出的频率) 请让我知道如何才能做到这一点 下面是一个简单的例子 startdate = '2020-01-01' endDate = '2020-12-01' frequency = 4 输出应该是 2020-01-01 2020-03-01 2020-06-01 20

我试着把一系列的日期分成相等的间隔。这是我正在使用的代码。(日期为YYYY-MM-dd格式)

在我的例子中,我希望以相等的间隔(每月以开始日期为一天)生成日期。在上面的例子中,我应该得到4个相等间隔的结果日期(正如我在几个月内给出的频率)

请让我知道如何才能做到这一点

下面是一个简单的例子

startdate = '2020-01-01'
endDate = '2020-12-01'
frequency = 4
输出应该是

2020-01-01
2020-03-01
2020-06-01
2020-09-01
示例代码

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class SOTest {

    static DateFormat dateFormat = new SimpleDateFormat("yyy-MM-dd");

    public static void main(String[] args) {
        try {
            String startDateString = "2020-01-01";
            String endDateString = "2020-12-01";

            int frequency = 4;
            Date startDate = (Date)dateFormat.parse(startDateString);
            Date endDate = (Date)dateFormat.parse(endDateString);
            Long intervalSize = (endDate.getTime()-startDate.getTime())/frequency;

            for(int i=0; i<= frequency && intervalSize > 0; i++) {
                Date date = new Date(startDate.getTime()+intervalSize*i);
                System.out.println("Date :: "+dateFormat.format(date));
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }   
    }
}
输入::开始日期='2020-02-27',结束日期='2022-02-26',间隔=4

Date :: 2020-02-27
Date :: 2020-08-27
Date :: 2021-02-26
Date :: 2021-08-27
Date :: 2022-02-26

我会这样做的。我会给我们看这节课的日历

public class FrequencyTransform {

public static void main (String[] args) {
    System.out.println("Split a date into equal intervals based on a given frequency");
    Integer frequency= 4;
    try {
        Date startDate = new SimpleDateFormat("yyyy-mm-dd").parse("2020-02-27");
        Date endDate = new SimpleDateFormat("yyyy-mm-dd").parse("2021-02-26");

        Calendar startCalendar = Calendar.getInstance();
        startCalendar.clear();
        startCalendar.setTime(startDate);

        Calendar endCalendar = Calendar.getInstance();
        endCalendar.clear();
        endCalendar.setTime(endDate);

        // id you want the interval to be months
        int monthsElapsed = elapsed(startCalendar, endCalendar, Calendar.MONTH);
        System.out.println("Number of months between dates:" + monthsElapsed);
        int interval = monthsElapsed % frequency;
        System.out.println("For the frequency 4 the interval is: " + interval);

        while (!startCalendar.after(endCalendar)){
            startCalendar.add(Calendar.MONTH,interval);
            Date auxDate= startCalendar.getTime();
            System.out.println(auxDate);
        }
    }
    catch (ParseException ex) {
        ex.printStackTrace();

    }


}

private static int elapsed(Calendar before, Calendar after, int field) {

    Calendar clone = (Calendar) before.clone(); // Otherwise changes are been reflected.
    int elapsed = -1;
    while (!clone.after(after)) {
        clone.add(field, 1);
        elapsed++;
    }
    return elapsed;
}
}


这只是一个简单的例子。你可以从这里拿走。问题是日历允许您使用不同的时间单位。您可以使用Calendar.DATE代替Calendar.MONTH表示天数,Calendar.YEAR表示年份。我不太确定你想怎么分手

你为什么给它贴上JS的标签?我不太清楚你想要实现什么。你想每季度换一次吗。如果startDate=2018-04-06,endDate=2020-10-06,会发生什么?听起来并不复杂。首先计算开始日期和结束日期之间的月数,然后除以频率,然后将结果频率时间添加到开始日期。@Magdalenafirax,我们有开始日期和结束日期。和另一个数字名称频率。我基本上希望根据频率(以月为单位)提取开始日期和结束日期(包括开始日期)之间的日期并打印它们。根据您的示例,我需要将开始日期和结束日期之间的日期划分为4个相等的间隔,并打印日期。@user3872094我已经发布了一个可能的答案,请告诉我是否有效
Date :: 2020-01-01
Date :: 2020-03-24
Date :: 2020-06-16
Date :: 2020-09-08
Date :: 2020-12-01
Date :: 2020-02-27
Date :: 2020-08-27
Date :: 2021-02-26
Date :: 2021-08-27
Date :: 2022-02-26
public class FrequencyTransform {

public static void main (String[] args) {
    System.out.println("Split a date into equal intervals based on a given frequency");
    Integer frequency= 4;
    try {
        Date startDate = new SimpleDateFormat("yyyy-mm-dd").parse("2020-02-27");
        Date endDate = new SimpleDateFormat("yyyy-mm-dd").parse("2021-02-26");

        Calendar startCalendar = Calendar.getInstance();
        startCalendar.clear();
        startCalendar.setTime(startDate);

        Calendar endCalendar = Calendar.getInstance();
        endCalendar.clear();
        endCalendar.setTime(endDate);

        // id you want the interval to be months
        int monthsElapsed = elapsed(startCalendar, endCalendar, Calendar.MONTH);
        System.out.println("Number of months between dates:" + monthsElapsed);
        int interval = monthsElapsed % frequency;
        System.out.println("For the frequency 4 the interval is: " + interval);

        while (!startCalendar.after(endCalendar)){
            startCalendar.add(Calendar.MONTH,interval);
            Date auxDate= startCalendar.getTime();
            System.out.println(auxDate);
        }
    }
    catch (ParseException ex) {
        ex.printStackTrace();

    }


}

private static int elapsed(Calendar before, Calendar after, int field) {

    Calendar clone = (Calendar) before.clone(); // Otherwise changes are been reflected.
    int elapsed = -1;
    while (!clone.after(after)) {
        clone.add(field, 1);
        elapsed++;
    }
    return elapsed;
}