Pergunta

I retrieve more data from a query, between 2 dates. The dates are the first day of the week of the first week on the month, and the last day of the week of the last week on the month. Precisly, currently month (for example) have the range dates as is (on Locale, monday is the first day of the week):

from 2014-03-31 to 2014-05-04 (35 days)

The problem is that the data retrieves are only the working days (for example: 5 days for week) but I must calculate the entire week for 7 days because every 7 days I write data in ArrayList.

I'm building a code to make this but doesn't works because the code calculates only 33 days, instead 35 days and I don't understand why...

This is my code:

DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
    Date firstdayoftheweek = new Date();
    try
    {
    firstdayoftheweek = formatter.parse("2014-03-31");
    }
    catch(ParseException e){}

    String dateTemp = null;

    for ( String[] result : results) // cicle for every query's row
    {

    count_row++;

    if (count_row == 1)
    {
        Date dtActualDayQuery = new Date();
        try
        {
            dtWd = formatter.parse(result[12]);
        }
        catch(ParseException e){}

        int diffDays = Days.daysBetween(new DateTime(firstdayoftheweek), new DateTime(dtActualDayQuery)).getDays();

        if (diffDays > 1)
        {
            count_row = (count_row + diffDays) -1;
        }
    }
    else
    {
        Date dtprevious = new Date();
        Date dtActualDayQuery = new Date();

        try
        {
            dtprevious = formatter.parse(dateTemp);
            dtActualDayQuery = formatter.parse(result[12]);
        }
        catch(ParseException e){}

        int diffDays = Days.daysBetween(new DateTime(dtprevious), new DateTime(dtActualDayQuery)).getDays();

        if (diffDays > 1)
        {
            count_row = (count_row + diffDays) -1;
        }
    }

    dateTemp = result[12]; // Save the date for next comparison

    // Do something every day of the week


    if (((count_row) % 7) == 0)
    {
        // Do something every 7 days
    }
}

Isn't correct, I know...but I can't think a correct solution...

Thanks!!

EDIT:

I've writed a sample code:

package test;

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

import org.joda.time.DateTime;
import org.joda.time.Days;

public class Test 
{
    public static void main(String[] args) 
    {
        int count = 0;

        String[] month = {"2014-03-31", "2014-04-01", "2014-04-02", "2014-04-03", "2014-04-04",
                "2014-04-07", "2014-04-08", "2014-04-09", "2014-04-10", "2014-04-11",
                "2014-04-14", "2014-04-15", "2014-04-16", "2014-04-17", "2014-04-18",
                "2014-04-21", "2014-04-22", "2014-04-23", "2014-04-24", "2014-04-25",
                "2014-04-28", "2014-04-29", "2014-04-30", "2014-05-01", "2014-05-02"};

        DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        Date dt_1day_absolute = new Date();

        try 
        {
            dt_1day_absolute = formatter.parse("2014-03-31");
        } 
        catch (ParseException e) {}

        String dateTemp = null;

        for (int i = 0; i < month.length; i++) 
        {

            count++;

            if (count == 1) 
            {
                Date dtFromVector = new Date();
                try 
                {
                    dtFromVector = formatter.parse(month[i]);
                } catch (ParseException e){}

                int diffDays = Days.daysBetween(new DateTime(dt_1day_absolute), new DateTime(dtFromVector)).getDays();

                if (diffDays > 1) 
                {
                    count = (count + diffDays) - 1;
                }
            } 
            else 
            {
                Date dtprev = new Date();
                Date dtaft = new Date();

                try 
                {
                    dtprev = formatter.parse(dateTemp);
                    dtaft = formatter.parse(month[i]);
                } 
                catch (ParseException e) {}

                int diffDays = Days.daysBetween(new DateTime(dtprev), new DateTime(dtaft)).getDays();

                if (diffDays > 1) 
                {
                    count = (count + diffDays) - 1;
                }
            }

            dateTemp = month[i];

            System.out.println("Num Day: " + String.valueOf(count));
            System.out.println("Date: " + month[i]);

            if (((count) % 7) == 0) 
            {
                System.out.println("---End week---");
                System.out.println("");
            }

        }
    }

}

I obtain this result:

Num Day:  1
Date:  2014-03-31
Num Day:  2
Date:  2014-04-01
Num Day:  3
Date:  2014-04-02
Num Day:  4
Date:  2014-04-03
Num Day:  5
Date:  2014-04-04
Num Day:  8
Date:  2014-04-07
Num Day:  9
Date:  2014-04-08
Num Day:  10
Date:  2014-04-09
Num Day:  11
Date:  2014-04-10
Num Day:  12
Date:  2014-04-11
Num Day:  15
Date:  2014-04-14
Num Day:  16
Date:  2014-04-15
Num Day:  17
Date:  2014-04-16
Num Day:  18
Date:  2014-04-17
Num Day:  19
Date:  2014-04-18
Num Day:  22
Date:  2014-04-21
Num Day:  23
Date:  2014-04-22
Num Day:  24
Date:  2014-04-23
Num Day:  25
Date:  2014-04-24
Num Day:  26
Date:  2014-04-25
Num Day:  29
Date:  2014-04-28
Num Day:  30
Date:  2014-04-29
Num Day:  31
Date:  2014-04-30
Num Day:  32
Date:  2014-05-01
Num Day:  33
Date:  2014-05-02

I expected this result:

Num Day:  1
Date:  2014-03-31
Num Day:  2
Date:  2014-04-01
Num Day:  3
Date:  2014-04-02
Num Day:  4
Date:  2014-04-03
Num Day:  5
Date:  2014-04-04
Num Day:  6
not exists
Num Day:  7
not exists
---End week---
Num Day:  8
Date:  2014-04-07
Num Day:  9
Date:  2014-04-08
Num Day:  10
Date:  2014-04-09
Num Day:  11
Date:  2014-04-10
Num Day:  12
Date:  2014-04-11
Num Day:  13
not exists
Num Day:  14
not exists
---End week---
Num Day:  15
Date:  2014-04-14
Num Day:  16
Date:  2014-04-15
Num Day:  17
Date:  2014-04-16
Num Day:  18
Date:  2014-04-17
Num Day:  19
Date:  2014-04-18
Num Day:  20
not exists
Num Day:  21
not exists
---End week---
Num Day:  22
Date:  2014-04-21
Num Day:  23
Date:  2014-04-22
Num Day:  24
Date:  2014-04-23
Num Day:  25
Date:  2014-04-24
Num Day:  26
Date:  2014-04-25
Num Day:  27
not exists
Num Day:  28
not exists
---End week---
Num Day:  29
Date:  2014-04-28
Num Day:  30
Date:  2014-04-29
Num Day:  31
Date:  2014-04-30
Num Day:  32
Date:  2014-05-01
Num Day:  33
Date:  2014-05-02
Num Day:  34
not exists
Num Day:  35
not exists
---End week---
Foi útil?

Solução

Next solution should be helpful:

final DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd"); // like 'SimleDateFormat'
final List<String> month = Arrays.asList("2014-03-31", "2014-04-01", "2014-04-02", "2014-04-03", "2014-04-04",
          "2014-04-07", "2014-04-08", "2014-04-09", "2014-04-10", "2014-04-11",
          "2014-04-14", "2014-04-15", "2014-04-16", "2014-04-17", "2014-04-18",
          "2014-04-21", "2014-04-22", "2014-04-23", "2014-04-24", "2014-04-25",
          "2014-04-28", "2014-04-29", "2014-04-30", "2014-05-01", "2014-05-02");
final DateTime lastDate = dtf.parseDateTime(month.get(month.size() - 1)); // last date in 'month' array
final MutableDateTime dateIterator = new MutableDateTime(dtf.parseDateTime(month.get(0))); // first date in 'month' array
int count = 0;
for (;;dateIterator.addDays(1)) // start iteration day by day 
{
   count++;
   final String dateAsString = dtf.print(dateIterator); // convert iterator to String
   if (month.contains(dateAsString)) // 'month' array contains current date
   {
      System.out.println("Date: " + dateAsString);
   }
   else
   {  
      if (dateIterator.getDayOfWeek() == 1   // current date is first day of week but record is absent in db
          && dateIterator.isAfter(lastDate)) // and all records from db are processed
                                             // so let's break for-loop

      {
         break; // break for-loop
      }   
      System.out.println("not exists");
   }
   System.out.println("Num Day: " + String.valueOf(count));
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top