Search code examples
androidandroid-calendarandroid-date

Find number of days, weeks, months and year between two milliseconds.


I need to set events in my custom calender which will repeat according to selected period i.e, daily, weekly, monthly or yearly. I have start and end dates in milliseconds.

Question:

Is there any Calender or Date API from which we can calculate number of days, weeks, months and year between two milliseconds. I used Joda library but not getting any appropriate method for this.

Should I had to write custom code for this ? :-(


Solution

  • I create a custom code for this task. Here you will find future date of events which is set between any two timestamps (start timestamp should be less or equal to end timestamp). You has to fix event duration like weekly,yearly,daily or monthly .

        public class EventManipulationClass {
    
       public EventManipulationClass(){
            for (int i = 0; i < MyPetApplication.instance.eventDatasArrayList.size(); i++) {
                String repType=MyPetApplication.instance.eventDatasArrayList.get(i).getRepeat();
                if (repType.equals("Daily")) {
                    computeDaily(<long startTimeMilliSeconds>,<long endTimeMilliSeconds>);
                } else if (repType.equals("Yearly")) {
                    computeYearly(<long startTimeMilliSeconds>,<long endTimeMilliSeconds>);
                } else if (repType.equals("Monthly")) {
                    computeMonthly(<long startTimeMilliSeconds>,<long endTimeMilliSeconds>);
                } else if (repType.equals("Weekly")) {
                    computeWeekely(<long startTimeMilliSeconds>,<long endTimeMilliSeconds>);
                } else {
                    <none>
                }
            }
        }
    
       private String doubleDigitDate(int date){
           String tempDate;
            if(date<10){
                tempDate="0"+date;
            }else {
                tempDate=""+date;
            }
            return tempDate;
       }
    
        private void computeWeekely(long starT,long endT){
            int sMonth;
            int sYear;
            int sDay;
    
            int eMonth;
            int eYear;
            int eDay;
    
            int diffMonth;
            int diffYear;
    
            Calendar startCalendar=GregorianCalendar.getInstance();
            startCalendar.setTimeInMillis(starT);
            sMonth=startCalendar.get(Calendar.MONTH)+1;
            sDay=startCalendar.get(Calendar.DAY_OF_MONTH);
            sYear=startCalendar.get(Calendar.YEAR);
    
            Calendar endCalendar=GregorianCalendar.getInstance();
            endCalendar.setTimeInMillis(endT);
            eMonth=endCalendar.get(Calendar.MONTH)+1;
            eDay=endCalendar.get(Calendar.DAY_OF_MONTH);
            eYear=endCalendar.get(Calendar.YEAR);
    
            diffMonth=eMonth-sMonth;
            diffYear=eYear-sYear;
    
            if(diffMonth==0 && diffYear==0){
                int eventDate = sDay;
                int totalDaysInMonth = getNumberOfDaysInMonth(sMonth, (sYear % 400 == 0) ? true:false);
                boolean isLastDay = false;
                for (int x2 = 0; x2 <= 5; x2++) {
                    if (eventDate <= totalDaysInMonth && eventDate <= eDay) {
                        System.out.println("same month same year 1=====> "+ sMonth+ "-" + eventDate + "-"+ sYear);
                        if(eventDate==eDay){
                                isLastDay=true;
                                break;
                            } else {
                                eventDate=eventDate+7;
                                continue;                               
                            }
                     }else { 
                         if (isLastDay) {
                                break;
                            }else{
                                System.out.println("same month same year 2 =====> "+ eMonth+ "-" + eDay + "-"+ eYear);
                                break;
                            }   
                     }
                    }
            } else if(diffMonth!=0 && diffYear==0){
            int eventDate = 0;
            int totalDaysInMonth = 0;
            @SuppressWarnings("unused")
            boolean isLastDay = false;
            for (int x = sMonth; x <= eMonth; x++) {
                if(x==sMonth){
                      eventDate=sDay;
                }else{
                      eventDate=Math.abs(eventDate-totalDaysInMonth);
                }
                totalDaysInMonth=getNumberOfDaysInMonth(x, (sYear % 400 == 0) ? true:false);
                for (int x2 = 0; x2 <= 5; x2++) {
                 if (eventDate <= totalDaysInMonth) {
                     if(x==eMonth && eventDate >eDay){
                        System.out.println("Diff month same year 1 =====> "+ x+ "-" + eDay + "-"+ sYear);
                        isLastDay=true;
                        break;
                    }else {
                        System.out.println("Diff month same year 2 =====> "+ x+ "-" + eventDate + "-"+ sYear);
                        if(x==eMonth && eventDate ==eDay){
                                isLastDay=true;
                                break;
                            } else {
                                eventDate=eventDate+7;
                                continue;                               
                        }
                    }
                } else {
                    break;
                }
            }
            }
        }else  { 
                int numberOfYear = Math.abs(sYear - eYear) ;
                Integer yearsArray[] = new Integer[numberOfYear+1];
                int eventDate = 0;
                for (int i = 0; i <= numberOfYear; i++) {
                    yearsArray[i] = sYear + i;
                }
                int totalDaysInMonth = 0;
                for (int j = 0; j < yearsArray.length ; j++) {
                    if (j == 0) {
                        for (int x = sMonth; x <= 12; x++) {
                            if(x==sMonth){
                                  eventDate=sDay;
                            }else{
                                  eventDate=Math.abs(eventDate-totalDaysInMonth);
                            }
                            totalDaysInMonth=getNumberOfDaysInMonth(x, (sYear % 400 == 0) ? true:false);
                            for (int x2 = 0; x2 <= 5; x2++) {
                                if (eventDate <= totalDaysInMonth) {
                                    System.out.println("Diff month Diff year 1=====> "+ x+ "-" + eventDate + "-"+ sYear);
                                    eventDate=eventDate+7;
                                } else {
                                    break;
                                }
                            }
                        }
                    } else if (j < yearsArray.length-1) {
                        for (int x = 1; x <= 12; x++) {
                            eventDate=Math.abs(eventDate-totalDaysInMonth);
                            totalDaysInMonth=getNumberOfDaysInMonth(x, (sYear % 400 == 0) ? true:false);
    
                            for (int x2 = 0; x2 <= 5; x2++) {
                                if (eventDate <= totalDaysInMonth) {
                                    System.out.println("Diff month Diff year 2=====> "+ x+ "-" + eventDate + "-"+ yearsArray[j]);
                                    eventDate=eventDate+7;
                                } else {
                                    break;
                                }
                            }
                        }
                    } else {
                        for (int x = 1; x <= eMonth; x++) {
                            eventDate=Math.abs(eventDate-totalDaysInMonth);
                            totalDaysInMonth=getNumberOfDaysInMonth(x, (sYear % 400 == 0) ? true:false);
    
                            for (int x2 = 0; x2 <= 5; x2++) {
                                if (eventDate <= totalDaysInMonth) {
                                    if(x==eMonth && eventDate >eDay){
                                        System.out.println("Diff month Diff year 3 1=====> "+ x+ "-" + eDay + "-"+ yearsArray[j]);
                                        break;
                                    }else {
                                        System.out.println("Diff month Diff year 3 2=====> "+ x+ "-" + eventDate + "-"+ yearsArray[j]);
    
                                        if(x==eMonth && eventDate >eDay){
                                            System.out.println("Diff month Diff year 3 1.2=====> "+ x+ "-" + eDay + "-"+ yearsArray[j]);
                                        break;
                                        } else {
                                            eventDate=eventDate+7;
                                            continue;
                                        }
                                    }
                                } else {
                                    if(x==eMonth && eventDate >eDay){
                                        System.out.println("Diff month Diff year 3 1.2=====> "+ x+ "-" + eDay + "-"+ yearsArray[j]);
                                        break;
                                        }
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }
    
        private void computeDaily(long starT,long endT){
            int sMonth;
            int sYear;
            int sDay;
    
            int eMonth;
            int eYear;
            int eDay;
    
            int diffMonth;
            int diffYear;
    
            Calendar startCalendar=GregorianCalendar.getInstance();
            startCalendar.setTimeInMillis(starT);
            sMonth=startCalendar.get(Calendar.MONTH)+1;
            sDay=startCalendar.get(Calendar.DAY_OF_MONTH);
            sYear=startCalendar.get(Calendar.YEAR);
    
            Calendar endCalendar=GregorianCalendar.getInstance();
            endCalendar.setTimeInMillis(endT);
            eMonth=endCalendar.get(Calendar.MONTH)+1;
            eDay=endCalendar.get(Calendar.DAY_OF_MONTH);
            eYear=endCalendar.get(Calendar.YEAR);
    
            diffMonth=eMonth-sMonth;
            diffYear=eYear-sYear;
    
            if(diffMonth==0 && diffYear==0){
                for (int i = sDay; i <= eDay; i++) {
                    System.out.println("same month same year 1=====> "+ sMonth+ "-" + i + "-"+ sYear);
                }
                }
            else if (diffMonth != 0 && diffYear == 0) {
                int totalDaysInMonth = 0;
                for (int x = sMonth; x <= eMonth; x++) {
                    if(x==sMonth){
                        totalDaysInMonth=getNumberOfDaysInMonth(x, (sYear % 400 == 0) ? true:false);
                        for (int i = sDay; i <= totalDaysInMonth; i++) {
                            System.out.println("Diff month same year 1=====> "+ x+ "-" + i + "-"+ sYear);
                        }
                    }else if(x==eMonth){
                        for (int i = 1; i <= eDay; i++) {
                            System.out.println("Diff month same year 1=====> "+ x+ "-" + i + "-"+ sYear);
                        }
                    }
                    else {
                        totalDaysInMonth = getNumberOfDaysInMonth(x, (sYear % 400 == 0) ? true:false);
                        for (int i = 1; i <= totalDaysInMonth; i++) {
                            System.out.println("Diff month same year 1=====> "+ x+ "-" + i + "-"+ sYear);
                        }
                    }
                }
    
            }else  { 
                int numberOfYear = Math.abs(sYear - eYear) ;
                Integer yearsArray[] = new Integer[numberOfYear+1];
                for (int i = 0; i <= numberOfYear; i++) {
                    yearsArray[i] = sYear + i;
                }
                int totalDaysInMonth = 0;
                for (int j = 0; j < yearsArray.length ; j++) {
                    System.out.println(">>>>>>>>> J" +j+">>>>>>>>"+yearsArray.length);
                    if (j == 0) {
                        for (int x = sMonth; x <= 12; x++) {
                            if(x == sMonth){
                                totalDaysInMonth=getNumberOfDaysInMonth(x, (sYear % 400 == 0) ? true:false);
                                for (int i = sDay; i <= totalDaysInMonth; i++) {
                                    System.out.println("Diff month Diff year 1=====> "+ x+ "-" + i + "-"+ sYear);
                                }
                            }else {
                                totalDaysInMonth = getNumberOfDaysInMonth(x, (sYear % 400 == 0) ? true:false);
                                for (int i = 1; i <= totalDaysInMonth; i++) {
                                    System.out.println("Diff month Diff year 1=====> "+ x+ "-" + i + "-"+ sYear);
                                }
                            }
                        }
                    } else if (j < yearsArray.length-1) {
                        for (int x = 1; x <= 12; x++) {
                            totalDaysInMonth = getNumberOfDaysInMonth(x, (sYear % 400 == 0) ? true:false);
                            for (int i = 1; i <= totalDaysInMonth; i++) {
                                System.out.println("Diff month Diff year 1=====> "+ x+ "-" + i + "-"+ yearsArray[j]);
                            }
                        }
                    } else {
                        for (int x = 1; x <= eMonth; x++) {
                            totalDaysInMonth = getNumberOfDaysInMonth(x, (sYear % 400 == 0) ? true:false);
                            if(x==eMonth){
                                for (int i = 1; i <= eDay; i++) {
                                    System.out.println("Diff month Diff year 1=====> "+ x+ "-" + i + "-"+ yearsArray[j]);
                                }
                            }else {
                                for (int i = 1; i <= totalDaysInMonth; i++) {
                                    System.out.println("Diff month Diff year 1=====> "+ x+ "-" + i + "-"+ yearsArray[j]);
                                }
                            }
                        }
                    }
                }
            }
        }
    
        private void computeMonthly(long starT,long endT){
            int sMonth;
            int sYear;
            int sDay;
    
            int eMonth;
            int eYear;
    
            int diffMonth;
            int diffYear;
    
            Calendar startCalendar=GregorianCalendar.getInstance();
            startCalendar.setTimeInMillis(starT);
            sMonth=startCalendar.get(Calendar.MONTH)+1;
            sDay=startCalendar.get(Calendar.DAY_OF_MONTH);
            sYear=startCalendar.get(Calendar.YEAR);
    
            Calendar endCalendar=GregorianCalendar.getInstance();
            endCalendar.setTimeInMillis(endT);
            eMonth=endCalendar.get(Calendar.MONTH)+1;
            eYear=endCalendar.get(Calendar.YEAR);
    
            diffMonth=eMonth-sMonth;
            diffYear=eYear-sYear;
    
            if(diffMonth==0 && diffYear==0){
                System.out.println("Same month same year=====> "+sMonth + "-" + sDay + "-"+ sYear);
            }else if(diffMonth!=0 && diffYear==0){
                for (int x = sMonth; x <= 12; x++) {
                    System.out.println("Diff month same year =====> "+x + "-" + sDay + "-"+ sYear);
                }
            }else  { 
                int numberOfYear = Math.abs(sYear - eYear) ;
                Integer yearsArray[] = new Integer[numberOfYear+1];
                for (int i = 0; i <= numberOfYear; i++) {
                    yearsArray[i] = sYear + i;
                }
                for (int j = 0; j < yearsArray.length ; j++) {
                 if (j == 0) {
                        for (int x = sMonth; x <= 12; x++) {
                            System.out.println("Diff month Diff year 1=====> "+ x+ "-" + sDay + "-"+ sYear);
                        }
                    } else if (j < yearsArray.length-1) {
                        for (int x = 1; x <= 12; x++) {
                            System.out.println("Diff month Diff year 2=====> "+x + "-" + sDay + "-" + yearsArray[j]);
                        }
                    } else {
                        for (int x = 1; x <= eMonth; x++) {
                            System.out.println("Diff month Diff year 3=====> "+x + "-" + sDay + "-" + yearsArray[j]);
                        }
                    }
                }
            }
        }
    
        private void computeYearly(long starT,long endT){
            int sMonth;
            int sYear;
            int sDay;
    
            int eMonth;
            int eYear;
            int eDay;
    
            int diffMonth;
            int diffYear;
    
            Calendar startCalendar=GregorianCalendar.getInstance();
            startCalendar.setTimeInMillis(starT);
            sMonth=startCalendar.get(Calendar.MONTH)+1;
            sDay=startCalendar.get(Calendar.DAY_OF_MONTH);
            sYear=startCalendar.get(Calendar.YEAR);
    
            Calendar endCalendar=GregorianCalendar.getInstance();
            endCalendar.setTimeInMillis(endT);
            eMonth=endCalendar.get(Calendar.MONTH)+1;
            eDay=endCalendar.get(Calendar.DAY_OF_MONTH);
            eYear=endCalendar.get(Calendar.YEAR);
    
            diffMonth=eMonth-sMonth;
            diffYear=eYear-sYear;
    
            if(diffMonth==0 && diffYear==0){
                System.out.println("Same month same year=====> "+sMonth + "-" + sDay + "-"+ sYear);
            }else if(diffMonth!=0 && diffYear==0){
                System.out.println("diff month same year=====> "+sMonth + "-" + sDay + "-"+ sYear);
            }else  { 
                int numberOfYear = Math.abs(sYear - eYear) ;
                Integer yearsArray[] = new Integer[numberOfYear+1];
                for (int i = 0; i <= numberOfYear; i++) {
                    yearsArray[i] = sYear + i;
                }
                for (int j = 0; j < yearsArray.length ; j++) {
                    if (j == 0) {
                        System.out.println("diff month diff year=====> "+sMonth + "-" + sDay + "-"+ sYear);
                    } else if (j < yearsArray.length-1) {
                        System.out.println("diff month diff year=====> "+sMonth + "-" + sDay + "-"+ yearsArray[j]);
                    } else {
                        System.out.println("diff month diff year=====> "+sMonth + "-" + eDay + "-"+  yearsArray[j]);
                    }
                }
            }
        }
    
        private int getNumberOfDaysInMonth(int currentMonth,boolean isLeapYear){
            int days = 0;
    
            if (currentMonth==1){
                days=31;
            }else if(currentMonth==2){
                if(isLeapYear)
                    days=29;
                else
                    days=28;
            }else if(currentMonth==3){
                days=31;
            }else if(currentMonth==4){
                days=30;    
            }else if(currentMonth==5){
                days=31;
            }else if(currentMonth==6){
                days=30;
            }else if(currentMonth==7){
                days=31;
            }else if(currentMonth==8){
                days=31;
            }else if(currentMonth==9){
                days=30;
            }else if(currentMonth==10){
                days=31;
            }else if(currentMonth==11){
                days=30;
            }else if(currentMonth==12){
                days=31;
            }
            return days;
        }
    }