Разделить дату на равные интервалы на основе заданной частоты - PullRequest
2 голосов
/ 21 февраля 2020

Я пытаюсь разбить диапазон дат на равные интервалы. Вот код, который я использую. (Даты в формате ГГГГ-ММ-дд)

    Integer frequency= 4;
    Date startDate = '2020-02-27';
    Date endDate = '2022-02-26';
    String[] startD = string.valueOf(behadelPlan.Start_datum__c).split('-');
    String[] endD = string.valueOf(behadelPlan.Einddatum__c).split('-');

    //String[] dates;
    Integer x = 0;
    Integer startYear = Integer.valueof(startD[0]);
    Integer endYear = Integer.valueof(endD[0]);
    //while (x < 4) {
    for (Integer i = startYear; i <= endYear; i++) {
        Integer endMonth = i != endYear ? 11 : Integer.valueof(endD[1]) - 1;
        Integer startMon = i == startYear ? Integer.valueof(startD[1]) - 1 : 0;
        for (Integer j = startMon; j <= endMonth  && x < frequency; j = j + 1) {
            Integer month = j + 1;
            String displayMonth;
            if (month < 10) {
                displayMonth = '0' + month;
            } else {
                displayMonth = String.valueOf(month);
            }
            List<string> slist = new string[]{string.valueOf(i), displayMonth, '01'};
                string allstring = string.join(sList,'-');
           System.debug(slist);
            x+=1;
        }

    }

при запуске я получаю вывод как

2020-02-01
2020-03-01
2020-04-01
2020-05-01

Здесь В моем случае я хочу сгенерировать даты в равные (ежемесячные с днем ​​начала дня) интервалы. В приведенном выше примере я должен получить итоговые даты в виде 4 равных интервалов (как я указал свою частоту в течение нескольких месяцев).

Пожалуйста, дайте мне знать, как мне этого добиться.

Вот простой пример.

startdate = '2020-01-01'
endDate = '2020-12-01'
frequency = 4

вывод должен быть

2020-01-01
2020-03-01
2020-06-01
2020-09-01

Ответы [ 2 ]

2 голосов
/ 21 февраля 2020

Вот как бы я это сделал. Для этого я воспользуюсь календарем класса.

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.MONTH вы можете использовать Calendar.DATE для дней, Calendar.YEAR для года. Я не был уверен, как ты хотел сделать раскол.

1 голос
/ 21 февраля 2020

Пример кода,

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

вывод для вышеупомянутого: *

Date :: 2020-01-01
Date :: 2020-03-24
Date :: 2020-06-16
Date :: 2020-09-08
Date :: 2020-12-01

Для ввода :: startDate = '2020-02-27', endDate = '2022-02-26', интервал = 4

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