UIDatePicker,根据今天的日期设置最大和最小日期

Posted

技术标签:

【中文标题】UIDatePicker,根据今天的日期设置最大和最小日期【英文标题】:UIDatePicker, setting maximum and minimum dates based on todays date 【发布时间】:2011-03-05 03:20:14 【问题描述】:

如果我有一个 UIDatePicker,并且我希望将最小和最大日期范围设置在三十年前和未来三十年之间,我该如何设置?

【问题讨论】:

【参考方案1】:

未经测试,但您可能想要这样的东西。

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *currentDate = [NSDate date];
NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setYear:30];
NSDate *maxDate = [calendar dateByAddingComponents:comps toDate:currentDate options:0];
[comps setYear:-30];
NSDate *minDate = [calendar dateByAddingComponents:comps toDate:currentDate options:0];

[datePicker setMaximumDate:maxDate];
[datePicker setMinimumDate:minDate];

Swift 4.1 更新

let calendar = Calendar(identifier: .gregorian)
var comps = DateComponents()
comps.year = 30
let maxDate = calendar.date(byAdding: comps, to: Date())
comps.year = -30
let minDate = calendar.date(byAdding: comps, to: Date())
datePicker.maximumDate = maxDate
datePicker.minimumDate = minDate

【讨论】:

如果你也有日期和月份栏,它不会搞砸吗?它将以其当前形式将月份和日期限制为当前日期。就像今天是 2015 年 6 月 3 日。几年都会好的。日将停留在最大值 3,月份将停留在最大值 6 月 没有。你是在瞎猜吗? 不,我在我正在开发的应用程序中尝试过,但遇到了我告诉你的问题。最后我不得不单独检查日期。 我刚刚在 ios 8 上将datePickerMode 设置为UIDatePickerModeDate 并按预期工作。我不知道您的实施可能出了什么问题,但您可能想将其作为一个单独的问题发布。 我为 Swift 4.1 创建了一个扩展:请从这里找到它:***.com/a/50580289/1298362【参考方案2】:
m_datePicker.maximumDate = [NSDate date];

您可以使用这行代码来设置最大日期(今天)。

【讨论】:

我怎样才能隐藏日期> maximumDate? 实际上,这会将最大日期设置为执行该行代码的确切分钟 它不允许选择比今天更晚的日期,但用户已经看到了更晚的日期。【参考方案3】:

我的@toddg swift 4 版本是:

let currentDate = Date()
var dateComponents = DateComponents()
let calendar = Calendar.init(identifier: .gregorian)
dateComponents.year = -100
let minDate = calendar.date(byAdding: dateComponents, to: currentDate)
dateComponents.year = -13
let maxDate = calendar.date(byAdding: dateComponents, to: currentDate)

非常适合我!

【讨论】:

【参考方案4】:

将最大日期设置为今天 Swift 4.2

datePicker.maximumDate = Date()

【讨论】:

【参考方案5】:

改编@warrenm 对 Swift 的回答:

let currentDate = NSDate()
let dateComponents = NSDateComponents()
dateComponents.year = -13
let minDate = calendar.dateByAddingComponents(dateComponents, toDate: currentDate, options: NSCalendarOptions(rawValue: 0))
dateComponents.year = 30
let maxDate = calendar.dateByAddingComponents(dateComponents, toDate: currentDate, options: NSCalendarOptions(rawValue: 0))


dobPicker.maximumDate = maxDate
dobPicker.minimumDate = minDate

【讨论】:

【参考方案6】:

今天正在研究这个问题,并在 Swift 3 中提出了一个扩展 UIDatePicker 的解决方案。

extension UIDatePicker

    /// set the date picker values and set min/max
    /// - parameter date: Date to set the picker to
    /// - parameter unit: (years, days, months, hours, minutes...)
    /// - parameter deltaMinimum: minimum date delta in units
    /// - parameter deltaMaximum: maximum date delta in units
    /// - parameter animated: Whether or not to use animation for setting picker
    func setDate(_ date:Date, unit:NSCalendar.Unit, deltaMinimum:Int, deltaMaximum:Int, animated:Bool)
    
        setDate(date, animated: animated)

        setMinMax(unit: unit, deltaMinimum: deltaMinimum, deltaMaximum: deltaMaximum)
    

    /// set the min/max for the date picker (uses the pickers current date)
    /// - parameter unit: (years, days, months, hours, minutes...)
    /// - parameter deltaMinimum: minimum date delta in units
    /// - parameter deltaMaximum: maximum date delta in units
    func setMinMax(unit:NSCalendar.Unit, deltaMinimum:Int, deltaMaximum:Int)
    
        if let gregorian = NSCalendar(calendarIdentifier:.gregorian)
        
            if let minDate = gregorian.date(byAdding: unit, value: deltaMinimum, to: self.date)
            
                minimumDate = minDate
            

            if let maxDate = gregorian.date(byAdding: unit, value: deltaMaximum, to: self.date)
            
                maximumDate = maxDate
            
        
    

setDate 方法将设置UIDatePicker 实例的三个值(日期、最小值、最大值)。

setMinMax 只设置最小值和最大值。最小值和最大值是使用选取器的当前日期计算的。

单位可以是以下值:

.年 .月 .day .小时 .分钟 .秒

要设置正负三十年的日期,代码为:

var datePicker = UIDatePicker()
var date = Date()

datePicker.setDate(date, unit:.year, deltaMinimum:-30, deltaMaximum:30, animated:true)

【讨论】:

【参考方案7】:

请试试这个代码 ios8+

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDate *currentDate = [NSDate date];
NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setYear:30];
NSDate *maxDate = [calendar dateByAddingComponents:comps toDate:currentDate options:0];
[comps setYear:-30];
NSDate *minDate = [calendar dateByAddingComponents:comps toDate:currentDate options:0];

[datePicker setMaximumDate:maxDate];
[datePicker setMinimumDate:minDate];

【讨论】:

【参考方案8】:

将最小日期设置为今天的日期

@IBOutlet var datePicker: UIDatePicker!

datePicker.minimumDate = NSDate() as Date

这将使 DatePicker 自动滚动到当前日期,即使滚动到旧日期也是如此

【讨论】:

以上是关于UIDatePicker,根据今天的日期设置最大和最小日期的主要内容,如果未能解决你的问题,请参考以下文章

删除/隐藏 UIDatePicker 最小/最大日期范围之外的行?

如何用 RXSwift 实现 UIDatePicker

如何从UIDatepicker中快速编辑用户的日期和时间选择器?

UIDatePicker:无法选择默认值

根据应用程序设置而不是设备设置在 UIDatepicker 中以 12 和 24 小时格式显示时间

UIDatePicker 泄漏