UIDatePicker,显示带有年份和时间的完整日期
UIDatePicker, display Full Date with YEAR and time
能否在 DatePicker 上 UIDatePicker
显示日、月、年和时间,或者我是否需要自定义 UIPickerView
?即
2000 年 11 月 12 日星期一上午 5 点 20 分
当前 .datePickerMode
设置为 .dateTime
的日期选择器显示
11 月 12 日星期一 5 上午 20 点
是的,你可以。但是您需要将两者结合起来。使用年份的选择器视图并将日期选择器的最小值设置为所选年份的第一天,将最大值设置为该年的最后一天。您还需要将 UIDatePicker
属性 [datePickerMode][1] 设置为 .dateAndTime
import UIKit
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
@IBOutlet weak var pickerView: UIPickerView!
@IBOutlet weak var datePicker: UIDatePicker!
let years = Array(Date().year-3...Date().year+3)
var date = Date()
var lastIndex = 3
override func viewDidLoad() {
super.viewDidLoad()
pickerView.delegate = self
pickerView.dataSource = self
datePicker.date = Date()
}
@IBAction func dateChanged(_ datePicker: UIDatePicker) {
date = datePicker.date
print(datePicker.date.year)
print(datePicker.date)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
pickerView.selectRow(3, inComponent: 0, animated: true)
setDatePickerMinimumAndMaximumDatesFor(year: years[3])
}
func pickerView(_ pickerView: UIPickerView,
numberOfRowsInComponent component: Int) -> Int {
return years.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return String(years[row])
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func setDatePickerMinimumAndMaximumDatesFor(year: Int) {
datePicker.minimumDate = year.firstDayOfTheYear
datePicker.maximumDate = year.lastDayOfTheYear
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
setDatePickerMinimumAndMaximumDatesFor(year: years[row])
if let optionalDate = Calendar.current.date(byAdding: .year, value: (lastIndex > row ? row - lastIndex : -(lastIndex - row)), to: date) {
datePicker.date = optionalDate
}
print(datePicker.date.year)
print(datePicker.date)
}
}
extension Date {
var year: Int {
return Calendar.current.component(.year, from: self)
}
}
extension Int {
var firstDayOfTheYear: Date {
return DateComponents(calendar: .current, year: self, month: 1, day: 1).date!
}
var lastDayOfTheYear: Date {
return DateComponents(calendar: .current, year: self, month: 12, day: 31).date!
}
}
能否在 DatePicker 上 UIDatePicker
显示日、月、年和时间,或者我是否需要自定义 UIPickerView
?即
2000 年 11 月 12 日星期一上午 5 点 20 分
当前 .datePickerMode
设置为 .dateTime
的日期选择器显示
11 月 12 日星期一 5 上午 20 点
是的,你可以。但是您需要将两者结合起来。使用年份的选择器视图并将日期选择器的最小值设置为所选年份的第一天,将最大值设置为该年的最后一天。您还需要将 UIDatePicker
属性 [datePickerMode][1] 设置为 .dateAndTime
import UIKit
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
@IBOutlet weak var pickerView: UIPickerView!
@IBOutlet weak var datePicker: UIDatePicker!
let years = Array(Date().year-3...Date().year+3)
var date = Date()
var lastIndex = 3
override func viewDidLoad() {
super.viewDidLoad()
pickerView.delegate = self
pickerView.dataSource = self
datePicker.date = Date()
}
@IBAction func dateChanged(_ datePicker: UIDatePicker) {
date = datePicker.date
print(datePicker.date.year)
print(datePicker.date)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
pickerView.selectRow(3, inComponent: 0, animated: true)
setDatePickerMinimumAndMaximumDatesFor(year: years[3])
}
func pickerView(_ pickerView: UIPickerView,
numberOfRowsInComponent component: Int) -> Int {
return years.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return String(years[row])
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func setDatePickerMinimumAndMaximumDatesFor(year: Int) {
datePicker.minimumDate = year.firstDayOfTheYear
datePicker.maximumDate = year.lastDayOfTheYear
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
setDatePickerMinimumAndMaximumDatesFor(year: years[row])
if let optionalDate = Calendar.current.date(byAdding: .year, value: (lastIndex > row ? row - lastIndex : -(lastIndex - row)), to: date) {
datePicker.date = optionalDate
}
print(datePicker.date.year)
print(datePicker.date)
}
}
extension Date {
var year: Int {
return Calendar.current.component(.year, from: self)
}
}
extension Int {
var firstDayOfTheYear: Date {
return DateComponents(calendar: .current, year: self, month: 1, day: 1).date!
}
var lastDayOfTheYear: Date {
return DateComponents(calendar: .current, year: self, month: 12, day: 31).date!
}
}