cannyboy
cannyboy

Reputation: 24446

UIDatePicker, setting maximum and minimum dates based on todays date

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?

Upvotes: 47

Views: 69902

Answers (8)

Rohit Daftari
Rohit Daftari

Reputation: 51

Set Minimum Date As Today's Date

@IBOutlet var datePicker: UIDatePicker!

datePicker.minimumDate = NSDate() as Date

This will make DatePicker auto-scroll to the current date even if scrolled to an older date

Upvotes: 0

ibyte
ibyte

Reputation: 471

Set max date to today Swift 4.2

datePicker.maximumDate = Date()

Upvotes: 6

warrenm
warrenm

Reputation: 31782

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

Upvotes: 90

David Fabreguette
David Fabreguette

Reputation: 117

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 !

Upvotes: 6

Jeff Muir
Jeff Muir

Reputation: 95

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)

Upvotes: 2

toddg
toddg

Reputation: 2916

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

Upvotes: 3

Binoy jose
Binoy jose

Reputation: 481

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

Upvotes: 1

Venu Gopal Tewari
Venu Gopal Tewari

Reputation: 5876

m_datePicker.maximumDate = [NSDate date];

You can use this line of code to set max date (Today).

Upvotes: 19

Related Questions