无法将字符串的转换日期设置为 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)
}
我有两个日期选择器,其中包含格式为 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)
}