如何将文本字段中的字符串转换为 NSDate 类型?

How to convert string in text field to NSDate type?

我想要完成的事情:

我正在尝试制作一个输入按钮来检查 UITextField 中的日期以查看它是否早于当前日期(今天的任何日期)以及 UITextField 中的日期是否是过去的,我想要抛出一个 error/alert 告诉用户输入未来的日期——可能是从当前日期开始的一周或一个月。

一点背景知识:

我制作了一个 viewController,其中包含一个用户要输入的文本字段 date into 它的工作方式是用户按下 textField 和 弹出一个 datePicker,允许他们使用 datePicker 更新 textField。

我运行遇到的问题:

在我想将 textField 中的日期与当前日期进行比较之前,一切正常。这是因为textField中的日期是字符串,不是NSDate可以识别的日期。

我的问题基本上是

How do I convert the string date in the TextField into a format that NSDate can recognize?

这是我的 enterButton 函数的代码:

@IBAction func enterButton(sender: AnyObject) {

    let dateFormatter = NSDateFormatter()
    var raceDate = raceDateTextField.text
    let currentDate = NSDate()

    raceDate = dateFormatter.stringFromDate(sender.date)

    if currentDate.compare(raceDate) == NSComparisonResult.OrderedDescending {
        print("Race Date is earlier than Current Date")

    }
}

我遇到错误

cannot convert value of type 'String?' to expected argument type 'NSDate' @ the line below

if currentDate.compare(raceDate) == NSComparisonResult.OrderedDescending {
        print("Race Date is earlier than Current Date")

}

这是我使用 datePicker 更新 textField 的代码,仅供参考:

@IBAction func textFieldEditing(sender: UITextField) {

    let datePicker:UIDatePicker = UIDatePicker()
    datePicker.datePickerMode = UIDatePickerMode.Date
    sender.inputView = datePicker
    datePicker.addTarget(self, action: #selector(SecondViewController.datePickerValueChanged), forControlEvents: UIControlEvents.ValueChanged)

}

func datePickerValueChanged(sender:UIDatePicker) {

    let dateFormatter = NSDateFormatter()
    dateFormatter.dateStyle = NSDateFormatterStyle.MediumStyle
    dateFormatter.timeStyle = NSDateFormatterStyle.NoStyle
    raceDateTextField.text = dateFormatter.stringFromDate(sender.date)

}

我是不是逻辑错误? 对此的任何帮助将不胜感激! :)


EDIT/UPDATE!

我按照你们的建议进行了更改,但我在同一行遇到了同样的错误。

这是我更新的代码:

 @IBAction func enterButton(sender: AnyObject) {

    let dateFormatter = NSDateFormatter()
    var raceDate = raceDateTextField.text
    dateFormatter.dateFormat = "dd/MM/yyyy"
    var minimumDate: NSDate? = NSDate()
    raceDate = dateFormatter.stringFromDate(sender.date)

    if minimumDate!.compare(raceDate) == NSComparisonResult.OrderedDescending {
        print("Race Date is earlier than Current Date")

    }
}

我认为 (sender.date) 参数是错误的 @ line:

raceDate = dateFormatter.stringFromDate(sender.date)

现在我想我输入了错误的参数 (sender.date) 因为 raceDate 在 if 语句中仍然显示为字符串数据类型。

当前在您的文本字段中的文本是一个字符串。您需要 运行 通过 dateFormatter 并获取日期 (NSDate)。之后您可以将它与当前日期进行比较。

这与在 textField 中设置文本基本相同,但相反。

参见:https://developer.apple.com/reference/foundation/nsiso8601dateformatter/1643127-datefromstring

您说过要将 textField 中的日期与当前日期进行比较。

因此,只需创建日期选择器并将其设置为今天的最短日期。 var minimumDate: NSDate?

例如:

if minimumDate.compare(raceDate) == NSComparisonResult.OrderedDescending {
    print("Race Date is earlier than Current Date. Are you a time traveler?")
}
@IBAction func enterButton(sender: AnyObject) {

   let myDate = raceDateTextField.text
   let dateFormatter = NSDateFormatter()
   dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
   let date = dateFormatter.dateFromString(myDate)!
   dateFormatter.dateFormat = "dd/MM/yyyy"
   let dateString = dateFormatter.stringFromDate(date)

}

感谢@Amit Jagesha、@tymac、@Andrei Filip 和@Leo Dabus,让它正常工作

这是最终产品,以防其他人遇到类似问题并供将来参考。

    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "MMM, dd, yyyy"
    let raceDate = raceDateTextField.text
    let date = dateFormatter.dateFromString(raceDate!)
    let minimumDate = NSDate()

    if minimumDate.compare(date!) == NSComparisonResult.OrderedDescending {
    }

Swift 3:

 let dateFormatter = DateFormatter()
 dateFormatter.dateFormat = "MMM, dd, yyyy"
 let raceDate = raceDateTextField.text
 let date = dateFormatter.date(from: raceDate!)
 let minimumDate = NSDate()

 if minimumDate.compare(date!) == ComparisonResult.orderedDescending {
 }