Bigkoo / Android-PickerView

This is a picker view for android , support linkage effect, timepicker and optionspicker.(时间选择器、省市区三级联动)
Apache License 2.0
13.45k stars 3.45k forks source link

TimePickerView 当前时间=结束时间有错误 #783

Open Jerry930326 opened 5 years ago

Jerry930326 commented 5 years ago

当设置当前时间=结束时间时,TimePickerView展示的是开始日期,如果当前时间=结束时间-1天时,TimePickerView正常显示。setDate的日期不能等于结束日期,这样就不能满足截止到当前日期时,默认展示当前日期的需求。

Jerry930326 commented 5 years ago

找到原因了,TimePickerView类中的initDefaultSelectedDate方法中: `//如果手动设置了时间范围 if (mPickerOptions.startDate != null && mPickerOptions.endDate != null) {

        //若默认时间未设置,或者设置的默认时间越界了,则设置默认选中时间为开始时间。
        if (mPickerOptions.date == null || mPickerOptions.date.getTimeInMillis() < mPickerOptions.startDate.getTimeInMillis()
                || mPickerOptions.date.getTimeInMillis() > mPickerOptions.endDate.getTimeInMillis()) {

            mPickerOptions.date = mPickerOptions.startDate;
        }

    } else if (mPickerOptions.startDate != null) {

        //没有设置默认选中时间,那就拿开始时间当默认时间
        mPickerOptions.date = mPickerOptions.startDate;
    } else if (mPickerOptions.endDate != null) {

        mPickerOptions.date = mPickerOptions.endDate;
    }`

比对的是getTimeInMillis,如果 endDate 比 date 创建的时间早的话,那就会把date赋值为 startDate,建议作者是否在比对时,判断一下 setType 的参数是显示哪几个字段,再去比对显示的字段。例如:只展示年月日,那就只比对年月日大小,忽略时分秒。

shuguoli68 commented 3 years ago

源码是比较时间戳,在不改源码的情况下,如果只使用年月日,可以将开始时间的时分秒赋值最小0:

startDate.set(Calendar.HOUR_OF_DAY, 0);
        startDate.set(Calendar.MINUTE, 0);
        startDate.set(Calendar.SECOND, 0);

结束是时间赋值最大23点59分59秒:

endDate.set(Calendar.HOUR_OF_DAY, 23);
        endDate.set(Calendar.MINUTE, 59);
        endDate.set(Calendar.SECOND, 59);