在 DatePicker-swift 中限制小时和分钟?

Posted

技术标签:

【中文标题】在 DatePicker-swift 中限制小时和分钟?【英文标题】:Restricting hours and minutes in DatePicker- swift? 【发布时间】:2021-01-21 00:27:51 【问题描述】:

大家好,我正在尝试创建一个时间选择器,其小时仅从(下午 2 点到晚上 9 点)开始,分钟增加 30 this is the picture of timePicker that i want to create 这是我的代码

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 开始有什么问题?谢谢

【问题讨论】:

设置 minimumDate "14:00" 和 maximumDate "21:00",试试这个。 没用 :( 【参考方案1】:

问题是您还需要设置日期选择器日期属性以匹配最小日期。您还需要将日期格式化程序的默认日期设置为今天,并且在解析日期字符串时间时不要忘记将语言环境设置为“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)

【讨论】:

感谢 Leo 的帮助,但我如何才能仅显示 5-9 小时?? 什么意思? minuteInterval = 60 并更改 minimumDatemaximumDate【参考方案2】:

你可以使用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, minute: 0, second: 0, 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
        
    

【讨论】:

非常感谢您的帮助,我现在唯一考虑的是显示 5-9 的时间范围。上述功能仅启用 5-9 小时,但仍显示 1-12 ! ? 您必须使用从 5-9 手动添加的组件行来创建 UIPickerView。否则,您无法将它们隐藏在UIDatePicker

以上是关于在 DatePicker-swift 中限制小时和分钟?的主要内容,如果未能解决你的问题,请参考以下文章

添加约束以将电池循环限制为每 24 小时 1 次充电和 1 次放电

当您达到每小时限制时,有没有办法“通知”?

Firestore限制每小时或每天读写一次,以防止用户在检查器中设置计时器

如何在 Laravel 中将每个用户的数据库字段更新限制为 24 小时一次

微星极光公众号激活宝——微信公众号48小时内无限制定时推送消息

StringBoot+redis-用户登陆限制密码输入次数(超出后禁用两个小时)