DatePicker.setMinDate (long minDate) jette IlllegalArgumentException: le temps ne se situe pas entre

J'ai un intervalle de temps consistant en un début et une date de fin. J'ai une façon de laisser l'utilisateur définir ces dates via DatePickerDialogs. Voici le code de la méthode qui crée et affiche les dialogues:

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)); } 

La valeur de la variable de beginning détermine si l'utilisateur a choisi de modifier la date de début ou de fin de l'intervalle. Ceux- someTimeDuringYear1 et similaires sont des variables de membres liées à la date de début, someTimeDuringYear2 et similaires sont liés à la date de fin de l'intervalle. Tous sont pré-configurés avant que ce dialogue ne soit jamais créé et affiché.

  • Comment faire pivoter les vues sur le changement d'orientation sans créer de mise en page?
  • Le constructeur de la classe intérieure privée est-il également privé?
  • Visual Studio ne peut pas déboguer l'application Android Xamarin
  • Rechercher dans OptionsMenu pas pleine largeur
  • Utilisation de l'injection de dépendance avec Roboguice?
  • AllArgsConstructor de lombok n'est pas trouvé par Android Studio
  • L'exception est lancée lors de l'édition à la fois du début et de l'intervalle de fin. Disons que j'ai choisi de modifier la date de fin de l'intervalle. Tout fonctionne parfaitement jusqu'à ce que je fixe la date à la dernière date à laquelle je suis autorisé. Si je le fais et confirme, tout semble encore bien, mais quand j'essaie de modifier la date de fin de l'intervalle, l'application tombe en panne et l'exception est lancée. (La même chose se produit si je définis la date de début de l'intervalle à la dernière date autorisée, puis essayez de la modifier à nouveau).

    Voici le journal 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) 

    J'ai cherché des réponses et essayé de proposer une solution toute l'après-midi. Toute aide est appréciée.

    Je vous remercie.

    PS: C'est la première question que je pose ici, alors je m'excuse s'il y a quelque chose de mal à propos. Je serai heureux de fournir toute information manquante sur ce qui se passe.

    EDIT: Curieusement, même si le problème soulève sur la ligne lorsque j'essaie de définir le minDate , il semble que la date est "plus grande" que le maxDate . La raison pour laquelle j'ai l'intention de croire que c'est que si je passe un someTimeDuringDay2 - 1 au lieu de someTimeDuringDay2 sur someTimeDuringDay2 au constructeur DatePickerDialog , le problème est éteint. Mais alors le champ "jour" dans le DatePicker est vraiment par un plus petit que je le veux. J'ai besoin d'être configuré sur someTimeDuringDay2 lorsque le DatePickerDialog est affiché, et non sur someTimeDuringDay2 - 1 . Mais il semble avoir un problème lorsque la date est identique à celle de maxDate .

  • Le pied de page de ListView ne s'affiche pas
  • PendingIntent programmé à l'aide de AlarmManager.RTC type est toujours invoqué en mode veille
  • Comment créer un lien pour tous les appareils mobiles qui ouvrent Google Maps avec un itinéraire à partir de l'emplacement actuel, destinée à un endroit donné?
  • Erreur de studio Android Cette bibliothèque de support ne doit pas utiliser une version inférieure (19)
  • Loader et LoaderManager - Comment déterminer si un Chargeur actuel est actif et en cours d'exécution?
  • Quel en-tête devrait être utilisé pour l'envoi de JSON comprimé GZIP depuis un client Android vers un serveur?
  • 7 Solutions collect form web for “DatePicker.setMinDate (long minDate) jette IlllegalArgumentException: le temps ne se situe pas entre”

    Le problème était que les heures, les minutes, les secondes et les millisecondes des calendriers que j'utilisais pour configurer le DatePicker 's minDate et maxDate été réglés sur les valeurs correspondantes à quelle heure il s'agissait de Calendar.getInstance() . Et quand j'ai passé le jour, le mois et l'année au constructeur de DatePickerDialog , les dates étaient les mêmes, mais les millisecondes différaient. Il se pourrait donc que les millisecondes définies dans maxDate soient inférieures aux millisecondes définies dans l' DatePicker actuelle de DatePicker , donc la date à laquelle le DatePicker était censé montrer était évaluée comme supérieure à maxDate (même si c'était toujours le même jour, juste Avec quelques millisecondes supplémentaires) … Et de même pour minDate .

    J'espère que c'est compréhensible.

    Donc, ce qui a aidé était de configurer les calendriers à la dernière milliseconde du jour où vous les utilisez pour configurer maxDate et à la première milliseconde du jour où vous les utilisez pour configurer minDate . Ainsi:

    (Juste un code de la clause 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()); 

    J'espère que cela vous sera utile.

    De plus, si quelqu'un propose une solution plus élégante, laissez-moi savoir.

    Pour améliorer la réponse ci-dessus, j'ai décidé de publier ceci.

    Lorsque vous appelez setMaxDate () plusieurs fois, disons une modification dynamique dans onPrepareDialog (), vous devez vous assurer que la nouvelle année maximale n'est pas égale à l'année maximale précédente ou que le nouveau jour maximum est égal à l'ancien jour maximum.

    Cela semble étrange mais c'est le code source du code 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(); } 

    Donc, pour moi, j'ai appelé deux fois SetMaxDate (). Une fois avec une valeur fictive où les années sont compensées par +100 et une seconde fois pour les champs réels que je veux.

    Voici le résultat combiné:

     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()); 

    J'ai eu la même exception quand aujourd'hui n'est pas dans [minDate, maxDate]. Mais si j'ai changé mon code pour appeler setMinDate() avant setMaxDate() , cela a fonctionné.

    J'avais la même erreur, je la réparai en configurant

     dialog.getDatePicker().setCalendarViewShown(false); 

    Dans l'application, aucune information n'était requise pour le calendrier. C'est ce que j'ai fait

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

    C'est ce que j'ai fait pour la même erreur que je recevais sur DatePicker. Donc, au moment où j'ai configuré MaxDate et MinDate sur DatePicker, les millisecondes changent. Pour ma demande, peu importe si la date était d'une seconde. J'avais besoin de la différence entre min et maxdates en deux jours.

      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); 

    J'espère que ça aide quelqu'un. Cela permettra de garder la date définie entre les bornes. Vous devrez peut-être modifier le décalage en fonction de votre application.

    J'ai résolu le problème similaire en fixant la limite du calendrier à un an (à partir de la date d'aujourd'hui)

      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()); 

    A eu un problème similaire avec setMinDate, cela l'a résolu:

     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()); 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.