无法将字符串的转换日期设置为 DatePicker 中的最小日期

Can't Set a Converted Date from String as Minimum Date in DatePicker

我有两个日期选择器,其中包含格式为 7:00 AM 和 8:00 PM 的时间,用于登录和注销。这些时间可能会有所不同。我想更改注销时间并尝试使用登录时间作为最短时间,但我的代码不起作用,我仍然可以 select 时间,如 1:00 AM 或 6:00 AM 作为注销.

这是我的 ViewDidLoad 中的代码

if let actualLoginText = loginTextField.text {

    let start = actualLoginText
    let formatter = DateFormatter()
    formatter.dateStyle = .none
    formatter.timeStyle = .short         
    formattedTime = formatter.date(from: start)!
}

这是我的注销选择器的代码

@objc func timeOutPickerValueChanged(sender: UIDatePicker) {

    let formatter = DateFormatter()
    formatter.dateStyle = .none
    formatter.timeStyle = .short
    timeOutPicker.minimumDate = Calendar.current.date(byAdding: .minute, value: 5, to: formattedTime)
    logoutTextField.text = formatter.string(from: sender.date)
}

我也试过了,还是不行

if let actualLoginText = loginTextField.text {

    let start = actualLoginText
    let formatter = DateFormatter()
    formatter.dateFormat = "hh:mm a"
    formattedTime = formatter.date(from: start)!
}

谢谢。

处理日期/时间时,处理 Date 对象,而不是字符串。 "string representation" 应该只用于向用户显示 date/time,而不是在操作值时。

这是一个简单的示例(假设您添加了两个 UIDatePickers 并连接了它们的 Value Changed 事件)。在加载时,它将 timeInPicker 初始化为当前的 date/time。任何时候你 select 一个新的 "Time In",timeOutPicker.minimumDate 设置为距 selected 时间 5 分钟,timeOutPicker.maximumDate 设置为 8-距最短时间的小时数:

class ViewController: UIViewController {

    @IBOutlet weak var timeInPicker: UIDatePicker!
    @IBOutlet weak var timeOutPicker: UIDatePicker!

    let dateFormatter: DateFormatter = {
        let df = DateFormatter()
        df.dateStyle = .short
        df.timeStyle = .short
        return df
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        // Initialize the TimeIn and TimeOut pickers to the current Date/Time
        let now = Date()
        updateTimeOutPicker(now)

    }

    func updateTimeOutPicker(_ withStartDateTime: Date) -> Void {

        // add 5 minutes to the selected "In" time to get the "minimum time" for the Out Picker
        guard let minDateTime = Calendar(identifier: .gregorian).date(byAdding: .minute, value: 5, to: withStartDateTime) else { return }

        // add 8 hours to the to get the "maximum time" for the Out Picker
        guard let maxDateTime = Calendar(identifier: .gregorian).date(byAdding: .hour, value: 8, to: minDateTime) else { return }

        timeOutPicker.minimumDate = minDateTime
        timeOutPicker.maximumDate = maxDateTime

        print("New Min Out Time:", dateFormatter.string(from: minDateTime))
        print("New Max Out Time:", dateFormatter.string(from: maxDateTime))
        print()

    }

    @IBAction func timeInPickerValueChanged(_ sender: UIDatePicker) {

        print("Selected In Time:", dateFormatter.string(from: sender.date))
        print()

        updateTimeOutPicker(sender.date)

    }

    @IBAction func timeOutPickerValueChanged(_ sender: UIDatePicker) {

        print("Selected Out Time:", dateFormatter.string(from: sender.date))
        print()

    }

}

已从数据库中提取登录和注销时间字符串。当我不编辑登录文本字段时,它的数据仍然是字符串,因为没有值更改,所以我不得不使用字符串值作为我的注销选择器的参考。

结果登录为:1999-12-31 23:00:00 +0000 并注销:2018-01-04 22:24:20 +0000

这就是为什么使用登录作为我的最短时间不起作用的原因

所以这就是我所做的,我添加了当前日期以便我可以使用它。

 @objc func timeOutPickerValueChanged(sender: UIDatePicker) {

    if let actualLoginText = loginTextField.text {

        let date = Date()

        let start = actualLoginText
        let formatter = DateFormatter()

        formatter.dateFormat = "yyyy-MM-dd"

        let nowTime = formatter.string(from: date)

        let concat = nowTime + " " + start

        let dateFormatter = DateFormatter()

        dateFormatter.dateFormat = "yyyy-MM-dd hh:mm a"

        formattedTime = dateFormatter.date(from: concat)!

    }

    let formatter = DateFormatter()

    formatter.dateStyle = .none

    formatter.timeStyle = .short

    timeOutPicker.minimumDate = Calendar.current.date(byAdding: .minute, value: 5, to: formattedTime)

    logoutTextField.text = formatter.string(from: sender.date)


}