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

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

【问题讨论】:

    标签: iphone objective-c nsdate 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 创建了一个扩展:请从这里找到它:stackoverflow.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 自动滚动到当前日期,即使滚动到旧日期也是如此

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-05-16
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-03-29
                • 2020-02-23
                相关资源
                最近更新 更多