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

时间:2018-01-05 08:18:16

标签: ios swift uidatepicker

我有两个日期选择器,包含时间格式为上午7:00和下午8:00,用于登录和注销。这些时间可能有所不同我想更改注销时间,并尝试使用登录时间作为最短时间,但我的代码不起作用,我仍然可以选择时间如凌晨1:00或早上6:00作为退出。

这是我的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)!
}

谢谢。

2 个答案:

答案 0 :(得分:1)

使用日期/时间时,使用Date个对象,而不是字符串。 "字符串表示"应仅用于向用户显示日期/时间,而不是用于操作值。

这是一个简单的示例(假设您添加了两个UIDatePickers并连接了他们的Value Changed个事件。加载时,它会将timeInPicker初始化为当前日期/时间。每次选择新的" Time In"时,timeOutPicker.minimumDate设置为距选定时间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()

    }

}

答案 1 :(得分:0)

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

结果登录名为: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)


}