Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


DatePicker.setMinDate (long minDate) lanza IllegalArgumentException: Tiempo no entre

Tengo un intervalo de tiempo que consiste en un comienzo y una fecha de finalización. Tengo una manera de dejar que el usuario establecer estas fechas a través de DatePickerDialogs. Aquí está el código del método que crea y muestra los diálogos:

private void editInterval(boolean beginning) { DatePickerDialog dpd; Calendar cal = Calendar.getInstance(); if (beginning) { dpd = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { someTimeDuringYear1 = year; someTimeDuringMonth1 = monthOfYear + 1; someTimeDuringDay1 = dayOfMonth; Calendar cal1 = Calendar.getInstance(); cal1.set(Calendar.YEAR, year); cal1.set(Calendar.MONTH, monthOfYear); cal1.set(Calendar.DAY_OF_MONTH, dayOfMonth); Calendar cal2 = Calendar.getInstance(); cal2.set(Calendar.YEAR, someTimeDuringYear2); cal2.set(Calendar.MONTH, someTimeDuringMonth2); cal2.set(Calendar.DAY_OF_MONTH, someTimeDuringDay2); if (cal1.getTimeInMillis() > cal2.getTimeInMillis()) { someTimeDuringYear2 = someTimeDuringYear1; someTimeDuringMonth2 = someTimeDuringMonth1; someTimeDuringDay2 = someTimeDuringDay1; } updateSomeTimeDuring(); editDepartureInterval(); } }, someTimeDuringYear1, someTimeDuringMonth1 - 1, someTimeDuringDay1); dpd.setTitle(getString(R.string.beginning_of_interval)); cal.add(Calendar.MONTH, 6); dpd.getDatePicker().setMaxDate(cal.getTimeInMillis()); cal.add(Calendar.MONTH, -6); cal.add(Calendar.DATE, 2); dpd.getDatePicker().setMinDate(cal.getTimeInMillis()); } else { dpd = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { someTimeDuringYear2 = year; someTimeDuringMonth2 = monthOfYear + 1; someTimeDuringDay2 = dayOfMonth; updateSomeTimeDuring(); editDepartureInterval(); } }, someTimeDuringYear2, someTimeDuringMonth2 - 1, someTimeDuringDay2); dpd.setTitle(getString(R.string.end_of_interval)); cal.add(Calendar.MONTH, 6); dpd.getDatePicker().setMaxDate(cal.getTimeInMillis()); cal.set(someTimeDuringYear1, someTimeDuringMonth1 - 1, someTimeDuringDay1); dpd.getDatePicker().setMinDate(cal.getTimeInMillis()); } dpd.show(); dpd.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT)); } 

El valor de la variable beginning determina si el usuario ha elegido editar la fecha de inicio o de finalización del intervalo. Aquellos someTimeDuringYear1 y similares son variables miembro relacionadas con la fecha de inicio, someTimeDuringYear2 y similares están relacionados con la fecha de finalización del intervalo. Todos ellos están predefinidos antes de que este diálogo se cree y muestre.

  • ¿Cuál es el tamaño máximo de un valor de preferencia compartida de Android?
  • Android Error al encontrar esta aplicación en PackageManager io.crash.air
  • Cordova no instala realmente la aplicación en el dispositivo Android
  • ¿La aplicación GWT funciona bien en el navegador de Android?
  • ¿Cómo puedo hacer que un TextView se desplace automáticamente al agregar más líneas de texto?
  • Correcciones DGPS en Android
  • Se genera la excepción al editar tanto el inicio como el final. Digamos que elijo editar la fecha de finalización del intervalo. Todo funciona perfectamente hasta que establezca la fecha a la última fecha que se me permite. Si lo hago y lo confirmo, todo todavía parece bien, pero cuando intento editar la fecha de finalización del intervalo de nuevo, la aplicación se bloquea y se produce la excepción. (Lo mismo sucede si establezco la fecha de inicio del intervalo en la última fecha permitida y luego intentar editarla de nuevo.)

    Aquí está el registro de LogCat:

     03-28 17:18:16.901: E/AndroidRuntime(6112): FATAL EXCEPTION: main 03-28 17:18:16.901: E/AndroidRuntime(6112): java.lang.IllegalArgumentException: Time not between Sat Mar 30 17:18:16 CET 2013 and Sat Sep 28 17:18:16 CEST 2013 03-28 17:18:16.901: E/AndroidRuntime(6112): at android.widget.CalendarView.goTo(CalendarView.java:805) 03-28 17:18:16.901: E/AndroidRuntime(6112): at android.widget.CalendarView.setMinDate(CalendarView.java:487) 03-28 17:18:16.901: E/AndroidRuntime(6112): at android.widget.DatePicker.setMinDate(DatePicker.java:315) 03-28 17:18:16.901: E/AndroidRuntime(6112): at com.skypicker.android.MainActivity.editInterval(MainActivity.java:344) 03-28 17:18:16.901: E/AndroidRuntime(6112): at com.skypicker.android.MainActivity.access$10(MainActivity.java:296) 03-28 17:18:16.901: E/AndroidRuntime(6112): at com.skypicker.android.MainActivity$5.onClick(MainActivity.java:261) 03-28 17:18:16.901: E/AndroidRuntime(6112): at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:924) 03-28 17:18:16.901: E/AndroidRuntime(6112): at android.widget.AdapterView.performItemClick(AdapterView.java:292) 03-28 17:18:16.901: E/AndroidRuntime(6112): at android.widget.AbsListView.performItemClick(AbsListView.java:1063) 03-28 17:18:16.901: E/AndroidRuntime(6112): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2519) 03-28 17:18:16.901: E/AndroidRuntime(6112): at android.widget.AbsListView$1.run(AbsListView.java:3173) 03-28 17:18:16.901: E/AndroidRuntime(6112): at android.os.Handler.handleCallback(Handler.java:605) 03-28 17:18:16.901: E/AndroidRuntime(6112): at android.os.Handler.dispatchMessage(Handler.java:92) 03-28 17:18:16.901: E/AndroidRuntime(6112): at android.os.Looper.loop(Looper.java:137) 03-28 17:18:16.901: E/AndroidRuntime(6112): at android.app.ActivityThread.main(ActivityThread.java:4424) 03-28 17:18:16.901: E/AndroidRuntime(6112): at java.lang.reflect.Method.invokeNative(Native Method) 03-28 17:18:16.901: E/AndroidRuntime(6112): at java.lang.reflect.Method.invoke(Method.java:511) 03-28 17:18:16.901: E/AndroidRuntime(6112): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787) 03-28 17:18:16.901: E/AndroidRuntime(6112): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554) 03-28 17:18:16.901: E/AndroidRuntime(6112): at dalvik.system.NativeStart.main(Native Method) 

    He estado buscando respuestas y tratando de llegar a una solución toda la tarde. Cualquier ayuda es apreciada.

    Gracias.

    PS: Esta es la primera pregunta que hago aquí, así que pido disculpas si hay algo malo en ello. Estaré encantado de proporcionar cualquier información que falte sobre lo que está sucediendo.

    EDIT: Curiosamente, aunque el problema se plantea en la línea cuando intento establecer la minDate , en realidad parece ser que la fecha es "más grande" que el maxDate . La razón que tengo para creer esto es que si paso someTimeDuringDay2 - 1 lugar de someTimeDuringDay2 al constructor de DatePickerDialog , el problema ha desaparecido. Pero entonces el campo "día" en el DatePicker es realmente uno más pequeño de lo que quiero que sea. Necesito que se establezca en someTimeDuringDay2 cuando se muestre DatePickerDialog , no en someTimeDuringDay2 - 1 . Pero parece tener un problema cuando la fecha es la misma que su maxDate .

  • AppBarLayout con contenedor FrameLayout como contenido de desplazamiento no funciona
  • Convertir archivo: Uri a archivo en Android
  • Iniciar el reconocimiento de voz a través de voz con frase como "Ok Google"?
  • Cómo poner un AVD (emulador) en el modo OFFLINE?
  • No hay manera de setProgressDrawable en RemoteViews
  • Android: ¿Cómo puedo cambiar la altura de un ProgressBar?
  • 7 Solutions collect form web for “DatePicker.setMinDate (long minDate) lanza IllegalArgumentException: Tiempo no entre”

    El problema fue que las horas, minutos, segundos y milisegundos de los calendarios que estaba usando para configurar la minDate y maxDate se maxDate a los valores correspondientes a la hora en que se llamó Calendar.getInstance() . Y cuando pasé el día, el mes y el año al constructor de DatePickerDialog , las fechas eran iguales, pero los milisegundos diferían. Así que podría ocurrir que los milisegundos establecidos en maxDate fueran menores que los milisegundos establecidos en la hora actual del DatePicker , por lo tanto la fecha que se suponía que el DatePicker debía mostrar fue evaluada como más grande que maxDate (aunque todavía era el mismo día, solo Con algunos milisegundos más) … Y de manera similar para minDate .

    Espero que sea comprensible.

    Así que lo que ayudó fue establecer los calendarios a la última milisegundo del día cuando se utilizan para la configuración de maxDate y el primer milisegundo del día cuando se utilizan para establecer minDate . Al igual que:

    (Sólo un pedazo de código de la cláusula else ).

      dpd.setTitle(getString(R.string.end_of_interval)); cal.add(Calendar.MONTH, 6); cal.set(Calendar.HOUR_OF_DAY, cal.getMaximum(Calendar.HOUR_OF_DAY)); cal.set(Calendar.MINUTE, cal.getMaximum(Calendar.MINUTE)); cal.set(Calendar.SECOND, cal.getMaximum(Calendar.SECOND)); cal.set(Calendar.MILLISECOND, cal.getMaximum(Calendar.MILLISECOND)); dpd.getDatePicker().setMaxDate(cal.getTimeInMillis()); cal.set(someTimeDuringYear1, someTimeDuringMonth1 - 1, someTimeDuringDay1); cal.set(Calendar.HOUR_OF_DAY, cal.getMinimum(Calendar.HOUR_OF_DAY)); cal.set(Calendar.MINUTE, cal.getMinimum(Calendar.MINUTE)); cal.set(Calendar.SECOND, cal.getMinimum(Calendar.SECOND)); cal.set(Calendar.MILLISECOND, cal.getMinimum(Calendar.MILLISECOND)); dpd.getDatePicker().setMinDate(cal.getTimeInMillis()); 

    Espero que sea útil para alguien.

    También si alguien viene con una solución más elegante, por favor hágamelo saber.

    Para mejorar la respuesta anterior, decidí publicar esto.

    Cuando se llama a setMaxDate () varias veces, digamos un cambio dinámico en onPrepareDialog (), debe asegurarse de que el nuevo año máximo no es igual al año máximo anterior o el nuevo día máximo es igual al día máximo anterior.

    Suena extraño, pero este es el código fuente de código grep

     public void setMaxDate(long maxDate) { mTempDate.setTimeInMillis(maxDate); if (mTempDate.get(Calendar.YEAR) == mMaxDate.get(Calendar.YEAR) && mTempDate.get(Calendar.DAY_OF_YEAR) != mMaxDate.get(Calendar.DAY_OF_YEAR)) { return; } mMaxDate.setTimeInMillis(maxDate); mCalendarView.setMaxDate(maxDate); if (mCurrentDate.after(mMaxDate)) { mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis()); updateCalendarView(); } updateSpinners(); } 

    Así que para mí, he llamado setMaxDate () dos veces. Una vez con un valor ficticio donde los años son compensados ​​por +100 y una segunda vez para los campos reales que quiero.

    Aquí está el resultado combinado:

     maxDate.set(Calendar.HOUR_OF_DAY, maxDate.getMaximum(Calendar.HOUR_OF_DAY)); maxDate.set(Calendar.MINUTE, maxDate.getMaximum(Calendar.MINUTE)); maxDate.set(Calendar.SECOND, maxDate.getMaximum(Calendar.SECOND)); maxDate.set(Calendar.MILLISECOND, maxDate.getMaximum(Calendar.MILLISECOND)); maxDateDummy.set(Calendar.HOUR_OF_DAY, maxDate.getMaximum(Calendar.HOUR_OF_DAY)); maxDateDummy.set(Calendar.MINUTE, maxDate.getMaximum(Calendar.MINUTE)); maxDateDummy.set(Calendar.SECOND, maxDate.getMaximum(Calendar.SECOND)); maxDateDummy.set(Calendar.MILLISECOND, maxDate.getMaximum(Calendar.MILLISECOND)); //update the dummy date by 100 years to force android OS to change max time. maxDateDummy.set(Calendar.YEAR, maxDateDummy.get(Calendar.YEAR) + 100); datePicker.setMaxDate(maxDateDummy.getTimeInMillis()); datePicker.setMaxDate(maxDate.getTimeInMillis()); 

    Tengo la misma excepción cuando hoy no está en [minDate, maxDate]. Pero si cambié mi código para llamar a setMinDate() antes de setMaxDate() , funcionó.

    Yo estaba recibiendo el mismo error, lo arreglo fijando

     dialog.getDatePicker().setCalendarViewShown(false); 

    En la aplicación cualquiera era calenderview no es necesario, Esto es lo que hice

     Calendar tempDate =Calendar.getInstance(); dialog.getDatePicker().setMaxDate(Calendar.getInstance().getTimeInMillis(); dialog.getDatePicker().setCalendarViewShown(false); tempDate.add(Calendar.YEAR, -120); dialog.getDatePicker().setMinDate(tempDate.getTimeInMillis()); 

    Esto es lo que hice por el mismo error que estaba recibiendo en DatePicker. Así que para el momento en que estaba fijando MaxDate y MinDate en DatePicker los milisegundos estaban cambiando. Para mi aplicación no importaba si la fecha era un segundo apagado. Necesitaba la diferencia entre min y maxdates como dos días.

      final Calendar c = Calendar.getInstance(); c.setTimeZone(TimeZone.getDefault()); int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH); int day = c.get(Calendar.DAY_OF_MONTH); DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(), this, year, month, day); long OFFSET = 1000 ; //milli seconds offset for your date. datePickerDialog.getDatePicker().setMaxDate(c.getTimeInMillis() + 1 * OFFSET); c.add(Calendar.DAY_OF_MONTH, -1); datePickerDialog.getDatePicker().setMinDate(c.getTimeInMillis() - 1 * OFFSET); 

    Espero que esto ayude a alguien. Esto mantendrá la fecha establecida para estar entre los límites. Es posible que tenga que cambiar la compensación en función de su aplicación.

    Resolví el problema similar estableciendo el límite del calendario a un año (a partir de la fecha de hoy)

      long A_YEAR_MILLISECOND = 12 * 30 * 24 * 60 * 60 * 1000L; datePickerDialog.getDatePicker().setMaxDate(Calendar.getInstance().getTimeInMillis() + A_YEAR_MILLISECOND); datePickerDialog.getDatePicker().setMinDate(Calendar.getInstance().getTimeInMillis()); 

    Tenía un problema similar con setMinDate, esto lo resolvió:

     int year=2017, month=1, day=1; // for min. date: 1. feb. 2017 Calendar cal = Calendar.getInstance(); cal.set( year, month, day, 0, 0, 0 ); //hour=0 min=0 sec=0 datePickerDialog.getDatePicker().setMinDate(cal.getTimeInMillis()); 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.