0

I have a List<Object[]> with two dates value and I have the 'filterFromDayStart' and filterToDayEnd which presente for example the following date 20.06.17 00:00:00 and 20.06.17 23:59:59

Now I want to cut row[15] or row[16] if there is overlapping with filterFromDayStart and filterToDayEnd; if there is no overlapping because the date/dates outside the area do not cut the dates.

filterToDayEnd: 20.06.17 00:00:00 filterToDayEnd: 20.06.17 23:59:59

date_1_start : 19.06.17 22:00:00 date_1_end: 20.06.17 02:00:00

cut to -->

date_1_start : 20.06.17 00:00:00 date_1_end: 20.06.17 02:00:00


date_2_start : 19.06.17 22:00:00 date_2_end: 19.06.17 22:00:00

do not cut to!


date_3_start : 20.06.17 22:00:00 date_3_end: 21.06.17 02:00:00

cut to -->

date_1_start : 20.06.17 22:00:00 date_1_end: 20.06.17 23:59:59

besides other cases...

I have tired the code below but some times the date is being cut even if there is no overlapping. How can I manage that?

row[15] = row[15].before(filterFromDayStart) ? filterFromDayStart : row[15];
row[16] = row[16].after(filterToDayEnd) ? filterToDayEnd : row[16];

Edit Here is my example:

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


public class DateBeforeAfter {

    public static void main(String[] args) {
        try {
            DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

            Date filterFrom = dateFormat.parse("2017-02-20 00:00:00.0");
            Date filterTo = dateFormat.parse("2017-02-20 23:59:59.0");

            Date date1 = dateFormat.parse("2017-02-20 16:10:00.0");
            Date date2 = dateFormat.parse("2017-02-21 16:50:00.0");

            Date date3 = dateFormat.parse("2017-02-19 19:42:00.0");
            Date date4 = dateFormat.parse("2017-02-20 19:46:00.0");

            Date date5 = dateFormat.parse("2017-02-19 19:42:00.0");
            Date date6 = dateFormat.parse("2017-02-19 19:46:00.0");

            ArrayList<Object[]> list = new ArrayList<Object[]>();
            Object[] element1 = { date1, date2 };
            list.add(element1);
            Object[] element2 = { date3, date4 };
            list.add(element2);
            Object[] element3 = { date5, date6 };
            list.add(element3);
            for (Object[] row : list) {
                row[0] = ((Date) row[0]).before(filterFrom) ? filterFrom : row[0];
                row[1] = ((Date) row[1]).after(filterTo) ? filterTo : row[1];

            }

            for (Object[] row : list) {
                System.out.println(Arrays.toString(row));

            }

        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

result

[Mon Feb 20 16:10:00 CET 2017, Mon Feb 20 23:59:59 CET 2017]
[Mon Feb 20 00:00:00 CET 2017, Mon Feb 20 19:46:00 CET 2017]
[Mon Feb 20 00:00:00 CET 2017, Sun Feb 19 19:46:00 CET 2017]

How can I make it in the right way so that the third one is not being cut?

The right result would be:

[Mon Feb 20 16:10:00 CET 2017, Mon Feb 20 23:59:59 CET 2017]
[Mon Feb 20 00:00:00 CET 2017, Mon Feb 20 19:46:00 CET 2017]
[Sun Feb 19 19:42:00 CET 2017, Sun Feb 19 19:46:00 CET 2017]

This part of code works for me:

    for (Object[] row : list) {
        if ((((Date) row[0]).before(filterFrom) && ((Date) row[1]).before(filterFrom))) {
            System.out.println("The record is before filterFrom: " + Arrays.toString(row));

        } else if ((((Date) row[0]).after(filterTo) && ((Date) row[1]).after(filterTo))) {
            System.out.println("The record is after filterFrom: " + Arrays.toString(row));

        } else {
            row[0] = ((Date) row[0]).before(filterFrom) ? filterFrom : row[0];
            row[1] = ((Date) row[1]).after(filterTo) ? filterTo : row[1];

        }

    }
TheBook
  • 1,698
  • 1
  • 16
  • 32

1 Answers1

0

You are only comparing row[0] with filterFrom, but in your third case, you must also check if row[1] is before filterFrom. Just change your for loop to:

for (Object[] row : list) {
    Date row0 = (Date) row[0];
    Date row1 = (Date) row[1];
    if (!row1.before(filterFrom)) {
        row[0] = row0.before(filterFrom) ? filterFrom : row[0];
        row[1] = row1.after(filterTo) ? filterTo : row[1];
    }
}

If row[1] is not before filterFrom, then you apply your rule. Otherwise, no change is needed.

This will produce the output you want.