1

UPDATE

I am creating a pregnancy due date countdown, so I use android.widget.DatePicker as a tool to set the due date.

For example:

  • the set due date is Jan. 9 2015
  • the date now is Nov. 9 2014
  • so the left months, days and weeks is 2 months, 62 days and 8weeks

So far i can only display the set due date.

Question: How to get the exact months weeks and days left when the user set the due date.

UPDATE CODE

Here's the code:

private TextView txtResultDueDate ;
       private DatePicker datePicker;
       private Calendar calendar;
       private int year;
       private int month;
       private int day;

       static final int DATE_DIALOG_ID = 999;

       @Override
       protected void onCreate(Bundle savedInstanceState) {

          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_profile);

           txtResultDueDate = (TextView) findViewById(R.id.txtDue);
           btnChangeDate = (Button)findViewById(R.id.button1);

            calendar = Calendar.getInstance();
            year = calendar.get(Calendar.YEAR);
            month = calendar.get(Calendar.MONTH);
            day = calendar.get(Calendar.DAY_OF_MONTH);
            showDate(year, month+1, day);

       @SuppressWarnings("deprecation")
       public void setDate(View view) {
          showDialog(999);
          Toast.makeText(getApplicationContext(), "ca", Toast.LENGTH_SHORT)
          .show();
       }

       @Override
       protected Dialog onCreateDialog(int id) {
       // TODO Auto-generated method stub
          if (id == 999) {
             return new DatePickerDialog(this, myDateListener, year, month, day);
           }
          return null;
       }

       private DatePickerDialog.OnDateSetListener myDateListener
       = new DatePickerDialog.OnDateSetListener() {

       @Override
       public void onDateSet(DatePicker arg0, int year, int month, int day) {
     Chronology chrono = GregorianChronology.getInstance();  
       DateTime end = new DateTime(arg0.getYear(), arg0.getMonth(), arg0.getDayOfMonth(), 0, 0, chrono);

       DateTime current = new DateTime();
       Interval interval = new Interval(current.toInstant(), end.toInstant());
       Period duePeriod = interval.toPeriod();
       showDate(duePeriod.getYears(), duePeriod.getMonths(), duePeriod.getDays());


       }
       };

       private void showDate(int year, int month, int day) {
          txtResultDueDate.setText(new StringBuilder().append(day).append("/")
          .append(month).append("/").append(year));
       }

This is the error that I encounter when I set the due date using DatePicker:

FATAL EXCEPTION: main

java.lang.IllegalArgumentException: The end instant must be greater orequal to the start

at org.joda.time.base.Abstraction.checkInterval(AbstractInterval.java.63)

at org.joda.time.base.BaseInterval(BaseInterval.java:94)

at org.joda.time.Interval.(Interval.java.122)

at com.date.androin.Profile$1.onDataset(Profile.java:168)

at android.app.DatePickerDialog.tryNotifyDataSet(DatePickerDialog.java.148)

at android.app.DatePickerDialog.onClick(DatePickerDialog.java.116)

at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)

at android.os.Handler.dispatchMessage(Handler.java:99)

at android.os.Looper.loop(Looper.java:137)

at android.app.ActivityThread.main(ActivityThread.java:5103)

at java.lang.reflect.Method.invokeNative(Native Method)

at java.lang.reflect.Method.invoke(Method.java:511)

at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)

at dalvik.system.NativeStrat.main(Native Method)

Rumit Patel
  • 8,830
  • 18
  • 51
  • 70
ziah299
  • 17
  • 2
  • 7
  • possible duplicate of [Calculate elapsed time in Java / Groovy](http://stackoverflow.com/questions/567659/calculate-elapsed-time-in-java-groovy) – Basil Bourque Nov 09 '14 at 18:21
  • Please search StackOverflow before posting. Hundreds of questions and answers have already addressed this topic. For example, notice the "Related" questions to the right, if viewing this on a web page. Tip: Specifically search for "joda" and "period". – Basil Bourque Nov 09 '14 at 18:25
  • i tried searching my question, but still my i couldn't find the right answer. so i try and decide to post a question. but i will still try searching for more answer... – ziah299 Nov 09 '14 at 19:05

4 Answers4

2

There is a library Joda Time. It is better the Date API provided by Java

Joda Time has a concept of time Interval:

Interval interval = new Interval(oldTime, new Instant());

Yes, you can use joda lib with android DatePicker

Chronology chrono = GregorianChronology.getInstance();
// end datetime
DateTime end = new DateTime(datePicker.getYear(), datePicker.getMonth(),       datePicker.getDayOfMonth(), 0, 0 ,chrono);

// current datetime
DateTime current = new DateTime();

Then instantiate Interval with start and end datetime

Interval interval = new Interval(current.toInstant(), end.toInstant()); then use the Interval api to get the Period from which you can extract the difference of months/days/weeks

Period duePeriod = interval.toPeriod();

// get difference in months

duePeriod.getMonths();

// get difference in weeks

duePeriod.getWeeks();

PLease refer the below Javadoc of Period for complete list of API http://joda-time.sourceforge.net/apidocs/org/joda/time/Period.html

For Android, in your case add the above code into your DatePicker onDateSet listener. finally the listener method would like this,

@Override
public void onDateSet(DatePicker arg0, int year, int month, int day) {
   // TODO Auto-generated method stub
   Chronology chrono = GregorianChronology.getInstance(); 
   // end datetime 
   DateTime end = new DateTime(arg0.getYear(), arg0.getMonth(), arg0.getDayOfMonth(), 0, 0, chrono);
   // current datetime 
   DateTime current = new DateTime();
   Interval interval = new Interval(current.toInstant(), end.toInstant());
   Period duePeriod = interval.toPeriod();
   showDate(duePeriod.getYears(), duePeriod.getMonths(), duePeriod.getDays());
}
Rumit Patel
  • 8,830
  • 18
  • 51
  • 70
Thilak
  • 656
  • 7
  • 15
  • can u please help me how to use joda time. i'm just new in android programming – ziah299 Nov 10 '14 at 06:51
  • i try your code but i got a error in this part DateTime end = new DateTime(arg0.getYear(), arg0.getMonth(), arg0.getDayOfMonth(), chrono); It said that "The constructor DateTime(int, int, int, Chronology) is undefined" so I tried to fix it by doing like this DateTime end = new DateTime(arg0.getYear(), arg0.getMonth(), arg0.getDayOfMonth(), day, month, year, chrono); but when i run my code my application force close or stop. It said that "java.lang.IllegealArgumentExecption:The end instant must be greater or equal to the start" – ziah299 Nov 10 '14 at 17:23
  • My bad sorry, I had corrected the code. Should work fine now. The problem is because of few arguments than actual to the constructor, thats why you got constructor undefined error. But please refer the javadoc to find the list of constructor's and its arguments a class supports, in future. Also make sure the user selected date via datepicker is after the current date. You can easily achieve that by initializing the datepicker's calendar to current and future dates only. So, the user cannot select a past date. – Thilak Nov 11 '14 at 07:35
  • i tried what you said and still i have the same error. by any chance do i need to chance my coding style to initialize the datepicker's? – ziah299 Nov 11 '14 at 12:46
  • what error do you get? paste here the entire stacktrace – Thilak Nov 12 '14 at 04:20
  • i just update may post you can check the error their – ziah299 Nov 12 '14 at 08:45
  • FATAL EXCEPTION: main java.lang.IllegalArgumentException: The end instant must be greater orequal to the start at org.joda.time.base.Abstraction.checkInterval(AbstractInterval.java.63) at org.joda.time.base.BaseInterval(BaseInterval.java:94) at org.joda.time.Interval.(Interval.java.122) at com.date.androin.Profile$1.onDataset(Profile.java:168) at android.app.DatePickerDialog.tryNotifyDataSet(DatePickerDialog.java.148) at android.app.DatePickerDialog.onClick(DatePickerDialog.java.116) at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166) – ziah299 Nov 13 '14 at 16:14
1
//somewhere in your code, init part
Calendar then = setDate(9, 0, 2015);//9 january 2015
Calendar c = Calendar.getInstance();
Calendar now = setDate(c.get(Calendar.DAY_OF_MONTH), c.get(Calendar.MONTH), c.get(Calendar.YEAR));
String leftDays = getLeftDays(then, now);//your result

//method setting days months years - we ignore hours and minutes
private String getLeftDays(Calendar then, Calendar now) {
    long leftMilis = then.getTimeInMillis() - now.getTimeInMillis();
    int seconds = (int) (leftMilis / 1000);
    Log.d(TAG, "seconds:" + seconds);
    int minutes = seconds / 60;
    Log.d(TAG, "minutes:" + minutes);
    int hours = minutes / 60;
    Log.d(TAG, "hours:" + hours);
    int days = hours / 24;
    Log.d(TAG, "days:" + days);
    int weeks = days / 7;
    Log.d(TAG, "weeks:" + weeks);

    //months.. another way calculating data due not equal amount of days per month
    Calendar temp = ((Calendar) then.clone());
    temp.add(Calendar.MONTH, -now.get(Calendar.MONTH));
    int months = temp.get(Calendar.MONTH);
    Log.d(TAG, "months:" + months);

    StringBuilder sb = new StringBuilder();
    String format = "%d months, %d days, %d weeks";
    String formatStr = String.format(format, months, days, weeks);

    String result = sb.append(formatStr).toString();
    Log.d(TAG, sb.toString());
    return result;
}

private Calendar setDate(int day, int month, int year) {
    Calendar c = Calendar.getInstance();
    c.set(Calendar.DAY_OF_MONTH, day);
    c.set(Calendar.MONTH, month);
    c.set(Calendar.YEAR, year);
    c.set(Calendar.HOUR, 0);
    c.set(Calendar.MINUTE, 0);
    c.set(Calendar.SECOND, 0);
    Log.d(TAG, c.getTime().toString());
    return c;
}
deadfish
  • 11,996
  • 12
  • 87
  • 136
0

Calendar c = calendar.getInstance();

and DatePickerDialog d

@Override public void onDateSet(DatePicker view,int Year,int mont of Year,int day of month){

Toast

c.get(Calendar.Year),c.get(Calendar.Month),c.get(Calendar.Day_of_Month);

d.show

Franky
  • 21
  • 2
0
this code is to find week from selected date,it's proper work.
Calendar date1 = Calendar.getInstance();
        Calendar date2 = Calendar.getInstance();

        date1.clear();
        date1.set(Integer.parseInt(selected_year), Integer.parseInt(selected_month), Integer.parseInt(selected_date)); // set date 1 (yyyy,mm,dd)
        System.out.println("Selected Date==>>" + date1);

        date2.clear();
        date2.set(Integer.parseInt(current_year), Integer.parseInt(current_month), Integer.parseInt(current_date));
        System.out.println("Current Date==>>" + date2);

        long diff = date2.getTimeInMillis() - date1.getTimeInMillis();
        float dayCount = (float) diff / (24 * 60 * 60 * 1000);
        week = (int) (dayCount / 7);

        if (week <= 0) {
            Toast.makeText(this, "Sry System Error", Toast.LENGTH_SHORT).show();
            System.out.println("Week==>>" + week);
            test = false;
        } else {
            Toast.makeText(this, "Done", Toast.LENGTH_SHORT).show();
            System.out.println("Week==>>" + week);
            test = true;
        }