如何将文本字段中的字符串转换为 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 {
}
我想要完成的事情:
我正在尝试制作一个输入按钮来检查 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 {
}