具有 5 分钟间隔的 UIDatePicker 以间隔显示日期
UIDatePicker with 5 min interval get date on appear with interval
我花了大约 3 个小时试图让 UIDatePicker
做我想做的事。我将它设置为 UITextField
的一个动作,以使用 UIDatePicker
连接到新的视图控制器。这一切都在起作用。我已经能够 select 一个日期并将其发送回原始视图控制器。
问题是我使用的是 5 分钟的时间间隔。如果我不将日期选择器 "wheels" 和 select 我的完成按钮移动到 return 到父控制器,则非间隔时间是 return编辑。所以 11:37 returns 11:37 当我需要 11:40 时。但是,如果我更改 "wheels" 它 return 是舍入时间。日期选择器当前显示 5 分钟的间隔。有什么线索可以引导我找到正确的解决方案吗?我在 viewDidAppear 上的 UIDatePicker
上尝试了 setDate
和 minuteInterval
无济于事。下面是我一直在使用的代码:
protocol DatePickerDelegate {
func datePickerDidSelect(selectedDate: String)
}
class DatePickerVC: UIViewController {
@IBOutlet weak var pickerView: UIDatePicker!
var selectedDate = ""
var delegate : DatePickerDelegate?
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewDidAppear(_ animated: Bool) {
//setDate()
//Have tried using setDate and minuteInterval here
}
func formatDate() -> DateFormatter {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMM d, yyyy h:mm a"
return dateFormatter
}
func setDate() {
let dateFormatter = formatDate()
selectedDate = dateFormatter.string(from: pickerView.date)
self.delegate?.datePickerDidSelect(selectedDate: selectedDate)
print(selectedDate)
}
@IBAction func datePickerChanged(_ sender: Any) {
setDate()
}
@IBAction func doneBtnPressed(_ sender: Any) {
self.dismiss(animated: true, completion: nil)
}
@IBAction func cancelBtnPressed(_ sender: Any) {
self.dismiss(animated: true, completion: nil)
}
}
您可以检查日期并根据您的需要四舍五入,如下所示:
override func viewDidLoad() {
super.viewDidLoad()
let calendar = Calendar.current
var dateComponents = calendar.dateComponents([.month, .day, .year, .hour, .minute], from: datePicker.date)
guard var hour = dateComponents.hour, var minute = dateComponents.minute else {
print("something went wrong")
return
}
let intervalRemainder = minute % datePicker.minuteInterval
if intervalRemainder > 0 {
// need to correct the date
minute += datePicker.minuteInterval - intervalRemainder
if minute >= 60 {
hour += 1
minute -= 60
}
// update datecomponents
dateComponents.hour = hour
dateComponents.minute = minute
// get the corrected date
guard let roundedDate = calendar.date(from: dateComponents) else {
print("something went wrong")
return
}
// update the datepicker
datePicker.date = roundedDate
}
}
有什么不明白的欢迎随时提问!
另一种方法是创建一个扩展程序,允许您调整 UIDatePicker
初始化时设置的日期值的间隔。
extension Date {
var nearest30Min: Date {
var dateComponents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute], from: self)
guard let hours = dateComponents.hour else { return self }
switch dateComponents.minute ?? 0 {
case 0...14:
dateComponents.minute = 0
case 15...44:
dateComponents.minute = 30
case 44...59:
dateComponents.minute = 0
dateComponents.hour = hours + 1
default:
break
}
return dateComponents.date ?? self
}
}
初始化 UIDatePicker
后,您可以使用以下代码更新 datePicker's
值:
datePicker.setDate(datePicker.date.nearest30min, animated: false)
我花了大约 3 个小时试图让 UIDatePicker
做我想做的事。我将它设置为 UITextField
的一个动作,以使用 UIDatePicker
连接到新的视图控制器。这一切都在起作用。我已经能够 select 一个日期并将其发送回原始视图控制器。
问题是我使用的是 5 分钟的时间间隔。如果我不将日期选择器 "wheels" 和 select 我的完成按钮移动到 return 到父控制器,则非间隔时间是 return编辑。所以 11:37 returns 11:37 当我需要 11:40 时。但是,如果我更改 "wheels" 它 return 是舍入时间。日期选择器当前显示 5 分钟的间隔。有什么线索可以引导我找到正确的解决方案吗?我在 viewDidAppear 上的 UIDatePicker
上尝试了 setDate
和 minuteInterval
无济于事。下面是我一直在使用的代码:
protocol DatePickerDelegate {
func datePickerDidSelect(selectedDate: String)
}
class DatePickerVC: UIViewController {
@IBOutlet weak var pickerView: UIDatePicker!
var selectedDate = ""
var delegate : DatePickerDelegate?
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewDidAppear(_ animated: Bool) {
//setDate()
//Have tried using setDate and minuteInterval here
}
func formatDate() -> DateFormatter {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMM d, yyyy h:mm a"
return dateFormatter
}
func setDate() {
let dateFormatter = formatDate()
selectedDate = dateFormatter.string(from: pickerView.date)
self.delegate?.datePickerDidSelect(selectedDate: selectedDate)
print(selectedDate)
}
@IBAction func datePickerChanged(_ sender: Any) {
setDate()
}
@IBAction func doneBtnPressed(_ sender: Any) {
self.dismiss(animated: true, completion: nil)
}
@IBAction func cancelBtnPressed(_ sender: Any) {
self.dismiss(animated: true, completion: nil)
}
}
您可以检查日期并根据您的需要四舍五入,如下所示:
override func viewDidLoad() {
super.viewDidLoad()
let calendar = Calendar.current
var dateComponents = calendar.dateComponents([.month, .day, .year, .hour, .minute], from: datePicker.date)
guard var hour = dateComponents.hour, var minute = dateComponents.minute else {
print("something went wrong")
return
}
let intervalRemainder = minute % datePicker.minuteInterval
if intervalRemainder > 0 {
// need to correct the date
minute += datePicker.minuteInterval - intervalRemainder
if minute >= 60 {
hour += 1
minute -= 60
}
// update datecomponents
dateComponents.hour = hour
dateComponents.minute = minute
// get the corrected date
guard let roundedDate = calendar.date(from: dateComponents) else {
print("something went wrong")
return
}
// update the datepicker
datePicker.date = roundedDate
}
}
有什么不明白的欢迎随时提问!
另一种方法是创建一个扩展程序,允许您调整 UIDatePicker
初始化时设置的日期值的间隔。
extension Date {
var nearest30Min: Date {
var dateComponents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute], from: self)
guard let hours = dateComponents.hour else { return self }
switch dateComponents.minute ?? 0 {
case 0...14:
dateComponents.minute = 0
case 15...44:
dateComponents.minute = 30
case 44...59:
dateComponents.minute = 0
dateComponents.hour = hours + 1
default:
break
}
return dateComponents.date ?? self
}
}
初始化 UIDatePicker
后,您可以使用以下代码更新 datePicker's
值:
datePicker.setDate(datePicker.date.nearest30min, animated: false)