限制DatePicker中的小时和分钟?

问题描述

嗨,我正在尝试创建一个时间选择器,该时间选择器仅从(2pm-9pm)开始,而分钟则增加30 GroupBy.transform 这是我的代码
func creatTimePicker() {
        timePicker.datePickerMode = .time
        timePicker.minuteInterval = 30
        let timeformatter = DateFormatter()
        timeformatter.dateFormat = "HH:mm"

        let min = timeformatter.date(from: "5:00")
        let max = timeformatter.date(from: "9:00")
        timePicker.minimumDate = min
        timePicker.maximumDate = max
        self.contentView.addSubview(timePicker)
    } 

问题是小时开始1-12,分钟开始00-59是什么问题?谢谢

解决方法

您可以使用Calendar来限制UIDatePicker()的时间范围

        let picker = UIDatePicker()
        picker.datePickerMode = .time
        
        let minDate = Calendar.current.date(bySettingHour: 14,minute: 0,second: 0,of: Date()) // 2PM
        
        let maxDate = Calendar.current.date(bySettingHour: 21,of: Date()) // 9PM
    
        picker.minimumDate = minDate
        picker.maximumDate = maxDate

这不会让用户选择超出指定时间范围的时间。

如果您只想显示这些时间

您可以使用UIPickerView

示例:

let picker = UIPickerView()
picker.dataSource = self
picker.delegate = self

let hoursRange = Array(5...9)

// Data source

func numberOfComponents(in: UIPickerView) -> Int {
        return 2
    }
    
func pickerView(_ pickerView: UIPickerView,numberOfRowsInComponent component: Int) -> Int {
        print("Com :\(component)")
        if component == 0 {
            return hoursRange.count
        }
        
        return 1 // For the PM indicator
    }

// Delegate
    
func pickerView(_ pickerView: UIPickerView,titleForRow row: Int,forComponent component: Int) -> String? {
        switch component {
        case 0:
            return "\(hoursRange[row])"
        case 1:
            return "AM"
        default:
            return nil
        }
    }

,

问题是您还需要将日期选择器的date属性设置为也与最小日期匹配。您还需要将日期格式器的默认日期设置为今天,并且在解析日期字符串时间时不要忘记将语言环境设置为“ en_US_POSIX”:

extension Formatter {
    static let time: DateFormatter = {
        let formatter = DateFormatter()
        formatter.locale = .init(identifier: "em_US_POSIX")
        formatter.dateFormat = "HH:mm"
        return formatter
    }()
}

let timePicker = UIDatePicker()
func creatTimePicker() {
    Formatter.time.defaultDate = Calendar.current.startOfDay(for: Date())
    let minimumDate = Formatter.time.date(from: "14:00")!
    let maximumDate = Formatter.time.date(from: "21:00")!
    timePicker.date = minimumDate 
    timePicker.datePickerMode = .time
    timePicker.minuteInterval = 30
    timePicker.minimumDate = minimumDate
    timePicker.maximumDate = maximumDate
    self.contentView.addSubview(timePicker)
}