Question

I'm having issues trying to use .setTime on a CalendarView object, see code below.

package com.example.calendar_test;

import java.util.Calendar;
import java.util.Date;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.text.format.DateFormat;
import android.text.format.Time;
import android.view.Menu;
import android.view.View;
import android.widget.CalendarView;
import android.widget.Toast;
import android.widget.CalendarView.OnDateChangeListener;

public class MainActivity extends Activity {
CalendarView cv;
@Override
protected void onCreate(Bundle savedInstanceState) {
    long startDate;
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    cv = (CalendarView) this.findViewById(android.R.id.content).findViewById(R.id.calendarView1);
    startDate = cv.getDate();
    cv.setDate(cv.getDate());
    final Context context = this;

    cv.setOnDateChangeListener(new OnDateChangeListener(){
         public void onSelectedDayChange(CalendarView view, int year, int month, int dayOfMonth) {
             Date selDate = new Date();
             selDate.setMonth(month);
             selDate.setYear(year);
             selDate.setDate(dayOfMonth);
             selDate.setTime(selDate.getTime());

             view.setDate(selDate.getTime());

             Date d = new Date();
             d.setMonth(2);
             d.setYear(2014);
             d.setDate(22);
             d.setTime(d.getTime());

             if(view.getDate() == d.getTime()){
                 Toast.makeText(context, "You hit the 22", Toast.LENGTH_SHORT).show();

             }

         }

    });

}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}



}

When I run I get this message when selecting a date. 02-17 15:50:30.501: E/MessageQueue-JNI(1098): java.lang.IllegalArgumentException: Time not between Mon Jan 01 00:00:00 EST 1900 and Fri Dec 31 00:00:00 EST 2100

Blowing up on view.setDate(selDate.getTime());

I don't quite understand why selDate.getTime() isn't a valid long for view.setDate()

Anyone?

Was it helpful?

Solution

When you create Date object, its year value is current year minus 1900. That's a valid value for calculating number of milliseconds elapsed since Jan 1, 1970, 00:00:00. When you modify year value of Date object by year from arguments list, those milliseconds are out of range, because that year in argument list, is just current year (without minus 1900).

You should replace

selDate.setYear(year); and selDate.setYear(2014);

with

selDate.setYear(year-1900); and selDate.setYear(114);

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top