【问题标题】:Split a date into equal intervals based on a given frequency根据给定的频率将日期拆分为相等的间隔
【发布时间】:2020-02-21 08:22:56
【问题描述】:

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

    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

【问题讨论】:

  • 你为什么把它标记为 JS?
  • 对我来说不是很清楚你想要实现什么。您是否希望每年每季度进行一次转型。如果 startDate = 2018-04-06 和 endDate = 2020-10-06 会发生什么。
  • 听起来不是很复杂。首先计算开始日期和结束日期之间的月数,然后除以频率,然后将结果频率时间添加到开始日期。
  • @MagdalenaFairfax,我们有一个开始日期和结束日期。和另一个数字名称频率。我基本上想根据频率(以月为单位)提取开始日期和结束日期(包括开始日期)之间的日期并打印它们。根据您的示例,我需要将开始日期和结束日期之间的日期划分为 4 个相等的间隔并打印日期。
  • @user3872094 我已经发布了一个可能的答案让我知道它是否有效

标签: java apex


【解决方案1】:

我会这样做。我会为此给我们上课日历。

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 用于年份。不太确定你想如何进行拆分。

【讨论】:

    【解决方案2】:

    示例代码,

    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', interval = 4

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

    【讨论】:

      猜你喜欢
      • 2017-11-04
      • 1970-01-01
      • 2017-10-24
      • 2020-02-23
      • 1970-01-01
      • 2020-07-11
      • 1970-01-01
      • 2019-03-07
      • 1970-01-01
      相关资源
      最近更新 更多