Iphone UIDatePicker,基于今天日期设置最大和最小日期

Iphone UIDatePicker,基于今天日期设置最大和最小日期,iphone,objective-c,nsdate,uidatepicker,Iphone,Objective C,Nsdate,Uidatepicker,如果我有一个UIDatePicker,并且我希望将最小和最大日期范围设置为30年前和未来30年之间,我将如何设置它?未测试,但您可能需要类似的设置 NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDate *currentDate = [NSDate date]; NSDateComponents *comps = [[NSDateComponents al

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

未测试,但您可能需要类似的设置

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

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

请尝试使用这段代码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];

将@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

我今天正在研究这个问题,并在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
仅设置最小值和最大值。使用选择器的当前日期计算最小值和最大值

单位可以是以下值:

  • .年
  • .月
  • .天
  • .小时
  • .分钟
  • .第二
将日期设置为正负三十年,代码为:

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

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

我的@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)

对我来说太棒了

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

datePicker.maximumDate = Date()

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

@IBOutlet var datePicker: UIDatePicker!

datePicker.minimumDate = NSDate() as Date

这将使DatePicker自动滚动到当前日期,即使滚动到较旧的日期

如果您也有day和months列,是否会出现问题?它将以当前形式将月份和天数限制为当前日期。比如今天是2015年6月3日。几年就好了。日将停留在最大值3,月将停留在最大值juneNo。你只是在盲目猜测吗?不,我在我正在开发的一个应用程序中试过了,我遇到了我告诉你的问题。最后,我不得不将支票分别放在日期上。我只是在iOS 8上试用了它,并将
datePickerMode
设置为
UIDatePickerModeDate
,效果如预期。我不知道您的实现中可能出现了什么问题,但是你可能想把它作为一个单独的问题发布。我已经为Swift 4.1创建了一个扩展:请从这里找到它:我如何隐藏日期>maximumDate?实际上,这会将最大日期设置为执行该行代码的精确分钟。它不允许用户选择比今天晚的日期,但用户会看到更晚的日期已经。
@IBOutlet var datePicker: UIDatePicker!

datePicker.minimumDate = NSDate() as Date