DayOfMonth 的无效值(有效值 1 - 28/31):2023

问题描述 投票:0回答:1

我正在使用 numberPicker 来显示日期,例如;

val numberPicker = binding.numberPicker
val values = getArrayDates(date.toString()) //EventsBottomSheet.kt:45
numberPicker.minValue = 0
numberPicker.maxValue = values.size - 1
numberPicker.displayedValues = values.toArray(arrayOfNulls<String>(values.size))
numberPicker.wrapSelectorWheel = true
numberPicker.setOnValueChangedListener { _, _, newVal ->
    binding.dateText.text = newVal.toString()
}

getArrayDates 函数;

private fun getArrayDates(referenceDate : String) : ArrayList<String>{
    val datesList = referenceDate.split("/")
    val localeDate = LocalDate.of(datesList[0].toInt(), Month.of(datesList[1].toInt()), datesList[2].toInt()) //EventsBottomSheet.kt:65 (related with exception)
    val monthsToDisplay = listOf(localeDate.minusMonths(1), localeDate, localeDate.plusMonths(1))
    val daysList = ArrayList<String>()
    val formatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG)
    for (month in monthsToDisplay) {
        val yearMonth = YearMonth.from(month)
        for (day in 1..yearMonth.lengthOfMonth()) {
            daysList.add(yearMonth.atDay(day).format(formatter))
        }
    }
    return daysList
}

我正在观察“日期”值,例如“21/05/2023”。我把它变成了 LocaleDate。但是我收到了这个错误;

 FATAL EXCEPTION: main
                                                                                                    Process: com.ahmetkaan.kediy, PID: 19391
                                                                                                    j$.time.DateTimeException: Invalid value for DayOfMonth (valid values 1 - 28/31): 2023
                                                                                                        at j$.time.temporal.ValueRange.checkValidValue(ValueRange.java:311)
                                                                                                        at j$.time.temporal.ChronoField.checkValidValue(ChronoField.java:713)
                                                                                                        at j$.time.LocalDate.of(LocalDate.java:250)
                                                                                                        at com.ahmetkaan.kediy.EventsBottomSheet.getArrayDates(EventsBottomSheet.kt:65)
                                                                                                        at com.ahmetkaan.kediy.EventsBottomSheet.onCreateView(EventsBottomSheet.kt:45)
                                                                                                        at androidx.fragment.app.Fragment.performCreateView(Fragment.java:3104)
                                                                                                        at androidx.fragment.app.DialogFragment.performCreateView(DialogFragment.java:510)
                                                                                                        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:524)
                                                                                                        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:261)
                                                                                                        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1899)
                                                                                                        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1823)
                                                                                                        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1760)
                                                                                                        at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:547)
                                                                                                        at android.os.Handler.handleCallback(Handler.java:942)
                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                                                        at android.os.Looper.loopOnce(Looper.java:201)
                                                                                                        at android.os.Looper.loop(Looper.java:288)
                                                                                                        at android.app.ActivityThread.main(ActivityThread.java:7872)
                                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                                        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
                                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)

首先,我认为这就是为什么开头的零可能是“03/05/2023 等”。但我尝试使用“13/12/2023”,但我仍然收到此错误。顺便说一句,错误与例如 2 月份缺少 30 无关。因为日期值是在过去的片段中用 LocaleDate 定义的。那么我该如何解决这个问题?

kotlin date datetime locale datetimepicker
1个回答
0
投票

看起来问题出在设置/声明 localDate 上。在这一行中,

  val localeDate = LocalDate.of(datesList[0].toInt(), Month.of(datesList[1].toInt()), datesList[2].toInt()) //EventsBottomSheet.kt:65 (related with exception)

首先,LocalDate.of() 的参考,

 public static LocalDate of(int year, Month month, int dayOfMonth) {
    throw new RuntimeException("Stub!");
}

所以,在设置或声明时,必须先输入年份,其次是月份,最后是日期。

代码行应该是这样的(当你以这种格式输入“21/05/2023”时):

val localeDate = LocalDate.of(datesList[2].toInt(), Month.of(datesList[1].toInt()), datesList[0].toInt())

先是年,然后是月,然后是月日。

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.