Ios UIDatePicker以5分钟的时间间隔获取日期以时间间隔显示

Ios UIDatePicker以5分钟的时间间隔获取日期以时间间隔显示,ios,swift,uidatepicker,Ios,Swift,Uidatepicker,我花了大约3个小时试图让一个UIDatePicker来完成我想要它做的事情。我将其设置为UITextField的动作,以使用UIDatePicker切换到新的视图控制器。这一切都在起作用。我已经能够选择一个日期并将其发送回原始视图控制器 问题是我使用了5分钟的时间间隔。如果我不移动日期选择器“轮子”,并选择我的完成按钮返回到父控制器,则返回非间隔时间。所以当我需要11:40时,11:37返回11:37。但是,如果我更改“轮子”,它将返回取整时间。日期选择器当前在屏幕上显示5分钟间隔。有什么线索能

我花了大约3个小时试图让一个
UIDatePicker
来完成我想要它做的事情。我将其设置为
UITextField
的动作,以使用
UIDatePicker
切换到新的视图控制器。这一切都在起作用。我已经能够选择一个日期并将其发送回原始视图控制器

问题是我使用了5分钟的时间间隔。如果我不移动日期选择器“轮子”,并选择我的完成按钮返回到父控制器,则返回非间隔时间。所以当我需要11:40时,11:37返回11:37。但是,如果我更改“轮子”,它将返回取整时间。日期选择器当前在屏幕上显示5分钟间隔。有什么线索能让我找到正确的解决方案吗?我在视图的
UIDatePicker
上尝试了
setDate
minuteInterval
,但似乎没有效果。以下是我一直使用的代码:

protocol DatePickerDelegate {
    func datePickerDidSelect(selectedDate: String)
}

class DatePickerVC: UIViewController  {

@IBOutlet weak var pickerView: UIDatePicker!

var selectedDate = ""
var delegate : DatePickerDelegate?


override func viewDidLoad() {
    super.viewDidLoad()
}

override func viewDidAppear(_ animated: Bool) {
    //setDate()
    //Have tried using setDate and minuteInterval here
}

func formatDate() -> DateFormatter {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "MMM d, yyyy h:mm a"
    return dateFormatter
}

func setDate() {
    let dateFormatter = formatDate()
    selectedDate = dateFormatter.string(from: pickerView.date)
    self.delegate?.datePickerDidSelect(selectedDate: selectedDate)
    print(selectedDate)
}

@IBAction func datePickerChanged(_ sender: Any) {
    setDate()
}

@IBAction func doneBtnPressed(_ sender: Any) {
    self.dismiss(animated: true, completion: nil)
}

@IBAction func cancelBtnPressed(_ sender: Any) {
    self.dismiss(animated: true, completion: nil)
}
}

您可以检查日期并根据自己的需要将其四舍五入,如下所示:

override func viewDidLoad() {
    super.viewDidLoad()

    let calendar = Calendar.current
    var dateComponents = calendar.dateComponents([.month, .day, .year, .hour, .minute], from: datePicker.date)
    guard var hour = dateComponents.hour, var minute = dateComponents.minute else {
        print("something went wrong")
        return
    }

    let intervalRemainder = minute % datePicker.minuteInterval
    if intervalRemainder > 0 {
        // need to correct the date
        minute += datePicker.minuteInterval - intervalRemainder
        if minute >= 60 {
            hour += 1
            minute -= 60
        }

        // update datecomponents
        dateComponents.hour = hour
        dateComponents.minute = minute

        // get the corrected date
        guard let roundedDate = calendar.date(from: dateComponents) else {
            print("something went wrong")
            return
        }

        // update the datepicker
        datePicker.date = roundedDate
    }
}

如果有任何不清楚的地方,请随时询问

另一种选择是创建一个扩展,允许您在初始化
UIDatePicker
时调整日期值的间隔

extension Date {
    var nearest30Min: Date {
        var dateComponents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute], from: self)
        guard let hours = dateComponents.hour else { return self }

        switch dateComponents.minute ?? 0 {
        case 0...14:
            dateComponents.minute = 0
        case 15...44:
            dateComponents.minute = 30
        case 44...59:
            dateComponents.minute = 0
            dateComponents.hour = hours + 1
        default:
            break
        }

        return dateComponents.date ?? self
    }
}
初始化
ui日期选择器
后,可以使用以下代码更新
datePicker的
值:

datePicker.setDate(datePicker.date.nearest30min, animated: false)

我实现了这个功能,但是必须将
datePicker.date=roundedDate
更改为
datePicker.setDate(roundedDate,动画:false)
。但在此期间,他们实际上决定在选择/更改时间之前禁用“完成”按钮,因为在这个应用程序中,他们很可能不会选择当前的开始时间。