【问题标题】:Restricting enabled time to a specific time span in UIDatePicker swift 4在UIDatePicker swift 4中将启用时间限制为特定时间跨度
【发布时间】:2025-12-14 12:45:01
【问题描述】:

我正在尝试将 datePicker 的时间限制为 09:00 AM 到 09:00 PM (21:00),时间间隔为 30 分钟。我已经尝试了所有已知的方法,并且已经在互联网上搜索了很长时间。但我什么也没找到。 这是我写的代码

//datePicker.setDate(dateFormatter.date(from: "09.00")!, animated: true)
datePicker.maximumDate = Calendar.current.date(byAdding: .hour, value: -12, to: dateFormatter.date(from: "21.00")!) //)Calendar.current.date(byAdding: Calendar.Component.hour, value: 1, to: Date())
 datePicker.minimumDate = Calendar.current.date(byAdding: Calendar.Component.hour, value: -12, to: dateFormatter.date(from: "09.00")!)

但它没有用。请帮忙。

【问题讨论】:

  • 你的datePickerdatePickerMode是什么?
  • 我打算挑时间的时候是.time

标签: ios swift xcode swift4


【解决方案1】:

限制用户,因此她/他只能选择 9 到 12 之间的日期,但会显示所有可用选项,因为这是日期选择器视图的默认行为,但通过设置正确的 minimumDatema​​ximumDate 用户只能在 9 到 21 之间选择。试试下面的代码,让我知道它是否有效

如果你想显示你选择的时间,我会建议更好地创建一个你想显示的时间数组,所以用户只会从你提供的数组中选择在这种情况下,时间介于上午 9 点和晚上 9 点,如 [9:00,9:30,10:00,10:30,.....,21:00] 并将该数组设置为普通选择器

datePicker.datePickerMode = .time // setting mode to timer so user can only pick time as you want 
datePicker.minuteInterval = 30  // with interval of 30 
let dateFormatter = DateFormatter()
dateFormatter.dateFormat =  "HH:mm"

let min = dateFormatter.date(from: "9:00")      //createing min time
let max = dateFormatter.date(from: "21:00") //creating max time
datePicker.minimumDate = min  //setting min time to picker
datePicker.maximumDate = max  //setting max time to picker

【讨论】:

  • 感谢您的评论!但这让事情发生了逆转。上午 9:00 前提供 It Mae 选择。我不知道为什么会这样。
  • 如果您选择少于 9 点,它将设置为上午 9 点,如果您选择多于晚上 9 点,它将返回到晚上 9 点
  • github.com/Iraniya/datePicker 在此处发布,其工作时间为上午 9 点至晚上 9 点检查
  • 我已经下载了,好像是个空项目。请检查一下。
  • 你创建了答案所以删除它,我已经更新了你可以检查
【解决方案2】:

您要输入minimumDatemaximumDate 的值是当前日期的上午9 点和晚上9 点。当前日期是您的代码中缺少的日期

let cal = Calendar.current
let now = Date()  // get the current date and time (2018-03-27 19:38:44)
let components = cal.dateComponents([.day, .month, .year], from: now)  // extract the date components 28, 3, 2018
let today = cal.date(from: components)!  // build another Date value just with date components, without the time (2018-03-27 00:00:00)
datePicker.minimumDate = today.addingTimeInterval(60 * 60 * 9)  // adds 9h
datePicker.maximumDate = today.addingTimeInterval(60 * 60 * 21) // adds 21h

【讨论】:

    【解决方案3】:

    您是否尝试通过情节提要实现这一目标?

    尝试以下配置:

    来自代码:

    let calendar = Calendar.current
    var dateComponents = calendar.dateComponents([.day, .month, .year], from: Date())
    dateComponents.setValue(9, for: .hour)
    let minDate = Calendar.current.date(from: dateComponents)
    dateComponents.setValue(21, for: .hour)
    let maxDate = Calendar.current.date(from: dateComponents)
    
    self.datePicker?.minimumDate = minDate
    self.datePicker?.maximumDate = maxDate
    self.datePicker?.minuteInterval = 30
    

    【讨论】:

    • 这个解决方案的问题是输出date将是2000年
    • 他只需要时间,不需要日期。
    • 但是如果你设置这个date来安排一些任务,它永远不会运行。您必须从 Date 值中过滤时间
    • 我没有使用情节提要中的选择器。这是一个文本字段的输入视图。谢谢你的评论! :)
    【解决方案4】:

    试试这个:

    let now = Date()
    datePicker.datePickerMode = .time
    datePicker.minimumDate = Calendar.current.date(bySettingHour: 9, minute: 0, second: 0, of: now)
    datePicker.maximumDate = Calendar.current.date(bySettingHour: 21, minute: 0, second: 0, of: now)
    datePicker.minuteInterval = 30
    

    【讨论】:

    • 我试过这个。但它使它反转,即它可以选择9:00, 8:30, 8:00...