如何正确设置最短日期并获取选择器视图上显示的最短日期?
How to set the minimum date properly and to get the minimum date that displayed on picker view?
我有一个如上图所示的弹出视图控制器。在 viewDidLoad
中,我将选择器视图的最小日期设置为现在 ( Date() ),而在故事板中,我将间隔时间设置为 15 分钟。这是我使用的代码
class DateTimePickerVC: UIViewController {
@IBOutlet var dateTimePickerView: UIDatePicker!
var selectedDateAndTime : Date?
override func viewDidLoad() {
super.viewDidLoad()
// to make live update of selected date
dateTimePickerView.addTarget(self, action: #selector(DateTimePickerVC.datePickerValueChanged), for: UIControl.Event.valueChanged)
// minimum date is now
dateTimePickerView.minimumDate = Date()
// set initial value, to avoid nil value
selectedDateAndTime = dateTimePickerView.date
}
@objc func datePickerValueChanged (datePicker: UIDatePicker) {
selectedDateAndTime = datePicker.date
}
@IBAction func pickedButtonDidPressed(_ sender: Any) {
// send date 'selectedDateAndTime' to other VC
}
}
我这里有 2 个问题:
假设用户在 16:28 打开弹出的 datePickerVC。我希望在该弹出窗口中显示的最短日期和时间为 "Today 16:30",但在我的情况下为 "Today 16:15"。如何解决这个问题?
为了避免 selectedDateAndTime
的 nil 值,在 viewDidLoad
中我设置了 selectedDateAndTime = dateTimePickerView.date
,所以我希望当用户立即点击保存按钮并发送date
到其他 VC 无需滚动日期选择器,它将获得 datePicker 中显示的最小日期。假设用户在 16:08 打开弹出窗口,我希望所选日期是 datePickerView 显示的最小日期和时间(今天 16:15),但我得到的实际日期值是(今天 16:08),因为我设置了 datePicker.minimumDate = Date()
(现在)。如何获取显示在 datePicker 视图上的最小日期?
我想你一定知道为什么它显示 16:15 因为时间 (16:28) 在逻辑上仍然小于 16:30 而我不知道不认为你可以这样做,因为它没有 任何逻辑意义
通过minimumDate
的声明:
var minimumDate: Date? { get set }
因为 minimumDate
有一个 get 属性,你可以只获取 最短日期 使用:
// Since it is an optional , we have to safe unwrap it
if let minimumDate = datePicker.minimumDate {
// Use your minimumDate variable here
}
enum DateRoundingType {
case round
case ceil
case floor
}
extension Date {
func rounded(minutes: TimeInterval, rounding: DateRoundingType = .round) -> Date {
return rounded(seconds: minutes * 60, rounding: rounding)
}
func rounded(seconds: TimeInterval, rounding: DateRoundingType = .round) -> Date {
var roundedInterval: TimeInterval = 0
switch rounding {
case .round:
roundedInterval = (timeIntervalSinceReferenceDate / seconds).rounded() * seconds
case .ceil:
roundedInterval = ceil(timeIntervalSinceReferenceDate / seconds) * seconds
case .floor:
roundedInterval = floor(timeIntervalSinceReferenceDate / seconds) * seconds
}
return Date(timeIntervalSinceReferenceDate: roundedInterval)
}
}
用法:
//add below code in viewDidLoad()
let nextMinuteIntervalDate = Date().rounded(
minutes: 15,
rounding: .ceil
)
dateTimePickerView.minimumDate = nextMinuteIntervalDate
dateTimePickerView.setDate(nextMinuteIntervalDate, animated: true)
我有一个如上图所示的弹出视图控制器。在 viewDidLoad
中,我将选择器视图的最小日期设置为现在 ( Date() ),而在故事板中,我将间隔时间设置为 15 分钟。这是我使用的代码
class DateTimePickerVC: UIViewController {
@IBOutlet var dateTimePickerView: UIDatePicker!
var selectedDateAndTime : Date?
override func viewDidLoad() {
super.viewDidLoad()
// to make live update of selected date
dateTimePickerView.addTarget(self, action: #selector(DateTimePickerVC.datePickerValueChanged), for: UIControl.Event.valueChanged)
// minimum date is now
dateTimePickerView.minimumDate = Date()
// set initial value, to avoid nil value
selectedDateAndTime = dateTimePickerView.date
}
@objc func datePickerValueChanged (datePicker: UIDatePicker) {
selectedDateAndTime = datePicker.date
}
@IBAction func pickedButtonDidPressed(_ sender: Any) {
// send date 'selectedDateAndTime' to other VC
}
}
我这里有 2 个问题:
假设用户在 16:28 打开弹出的 datePickerVC。我希望在该弹出窗口中显示的最短日期和时间为 "Today 16:30",但在我的情况下为 "Today 16:15"。如何解决这个问题?
为了避免
selectedDateAndTime
的 nil 值,在viewDidLoad
中我设置了selectedDateAndTime = dateTimePickerView.date
,所以我希望当用户立即点击保存按钮并发送date
到其他 VC 无需滚动日期选择器,它将获得 datePicker 中显示的最小日期。假设用户在 16:08 打开弹出窗口,我希望所选日期是 datePickerView 显示的最小日期和时间(今天 16:15),但我得到的实际日期值是(今天 16:08),因为我设置了datePicker.minimumDate = Date()
(现在)。如何获取显示在 datePicker 视图上的最小日期?
我想你一定知道为什么它显示 16:15 因为时间 (16:28) 在逻辑上仍然小于 16:30 而我不知道不认为你可以这样做,因为它没有 任何逻辑意义
通过
minimumDate
的声明:
var minimumDate: Date? { get set }
因为 minimumDate
有一个 get 属性,你可以只获取 最短日期 使用:
// Since it is an optional , we have to safe unwrap it
if let minimumDate = datePicker.minimumDate {
// Use your minimumDate variable here
}
enum DateRoundingType {
case round
case ceil
case floor
}
extension Date {
func rounded(minutes: TimeInterval, rounding: DateRoundingType = .round) -> Date {
return rounded(seconds: minutes * 60, rounding: rounding)
}
func rounded(seconds: TimeInterval, rounding: DateRoundingType = .round) -> Date {
var roundedInterval: TimeInterval = 0
switch rounding {
case .round:
roundedInterval = (timeIntervalSinceReferenceDate / seconds).rounded() * seconds
case .ceil:
roundedInterval = ceil(timeIntervalSinceReferenceDate / seconds) * seconds
case .floor:
roundedInterval = floor(timeIntervalSinceReferenceDate / seconds) * seconds
}
return Date(timeIntervalSinceReferenceDate: roundedInterval)
}
}
用法:
//add below code in viewDidLoad()
let nextMinuteIntervalDate = Date().rounded(
minutes: 15,
rounding: .ceil
)
dateTimePickerView.minimumDate = nextMinuteIntervalDate
dateTimePickerView.setDate(nextMinuteIntervalDate, animated: true)