UIDatePicker, setting maximum and minimum dates based on todays date

前端 未结 7 1391
粉色の甜心
粉色の甜心 2020-12-02 18:36

If I have a UIDatePicker, and I wish to set the minimum and maximum date range to be between thirty years ago and thirty years in the future, how would I set that up?

相关标签:
7条回答
  • 2020-12-02 18:49

    Not tested, but you probably want something like this.

    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];
    

    Update for 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
    
    0 讨论(0)
  • 2020-12-02 18:50

    Was looking at this issue today and came up with a solution in Swift 3 that extends 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
                }
            }
        }
    }
    

    The setDate method will set three values (date, minimum, maximum) of the UIDatePicker instance.

    setMinMax only sets the minimum and maximum. Minimum and maximum are calculated using the picker's current date.

    Unit can be the following values:

    • .year
    • .month
    • .day
    • .hour
    • .minute
    • .second

    To set the date with plus and minus thirty years, the code would be:

    var datePicker = UIDatePicker()
    var date = Date()
    
    datePicker.setDate(date, unit:.year, deltaMinimum:-30, deltaMaximum:30, animated:true)
    
    0 讨论(0)
  • 2020-12-02 18:56

    Please Try this code 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];
    
    0 讨论(0)
  • 2020-12-02 19:03

    Set max date to today Swift 4.2

    datePicker.maximumDate = Date()
    
    0 讨论(0)
  • 2020-12-02 19:11

    Adapting @warrenm's answer to 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
    
    0 讨论(0)
  • 2020-12-02 19:13

    My swift 4 version of @toddg is :

    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)
    

    Works great for me !

    0 讨论(0)
提交回复
热议问题