在日期选择器(Swift)中获取不可用的日期

在日期选择器(Swift)中获取不可用的日期,swift,uidatepicker,Swift,Uidatepicker,我有一个UIDatePicker,从今天到下周(从Date()到Date().day+7)可以使用 假设今天是一个月的第30天,那么可以选择的日期是本月的第30天和下个月的第一到第六天 在这种情况下,我需要将datePicker month更改为next month,因为用户将day从30更改为1 但问题是: 当我将日期更改为无效日期时,.change方法将为我提供最不有效的日期 示例: 假设: 今天=7月28日 可选择日期=7月28日至8月3日 我需要什么: 用户不能选择7月28日之前和8

我有一个UIDatePicker,从今天到下周(从Date()到Date().day+7)可以使用

假设今天是一个月的第30天,那么可以选择的日期是本月的第30天和下个月的第一到第六天

在这种情况下,我需要将datePicker month更改为next month,因为用户将day从30更改为1

但问题是: 当我将日期更改为无效日期时,.change方法将为我提供最不有效的日期

示例:


假设:

  • 今天=7月28日

  • 可选择日期=7月28日至8月3日


  • 我需要什么:

  • 用户不能选择7月28日之前和8月3日之后的日期

  • 当用户希望将日期更改为8月1日、2日或3日时,日期选择器本身会将月份更改为8月,并使1、2和3可供用户使用 由用户选择


  • 主要问题

  • 当用户将日期更改为1、2或3时,我无法获得1、2或3!它还给我“28”
    只需将
    UIDatePicker
    maximumDate属性设置为所需日期

    func setupDatePicker(){
    
       var currDateComponents = getDateComponents(fromDate: Date())
       var maxDateComponents = currDateComponents
    
       if let date = currDateComponents?.day{
            maxDateComponents?.day = date + 7
       }
    
       self.datePicker?.maximumDate = getDate(fromDateComponents: maxDateComponents)
    
    }
    
    func getDateComponents(fromDate date: Date?)-> DateComponents?{
        let calendar = Calendar(identifier: .gregorian)
        var dateComponents: DateComponents? = nil
        if(date != nil){
            dateComponents = calendar.dateComponents([.day, .month, .year], from: date!)
        }
    
        return dateComponents
     }
    
     func getDate(fromDateComponents dateComponents:DateComponents?)-> Date?{
        let calendar = Calendar(identifier: .gregorian)
    
        if let componentsBasedDate = calendar.date(from: dateComponents!) {
            return componentsBasedDate
        }
    
        return nil
     }
    

    在viewDidLoad中调用此函数以设置日历以设置最大和最小日期:

    fileprivate func setupCalendar() {
        datePicker.minimumDate = Calendar.current.date(byAdding: .day, value: 0, to: ServerTime.sharedInstance.nowTime)
        datePicker.maximumDate = Calendar.current.date(byAdding: .day, value: +7, to: ServerTime.sharedInstance.nowTime)
    }
    
    对于计算显示日期和当前日期之间的天数,我使用了以下方法:

    extension Date {
     //Calculate days between two day objects
    func daysBetween(_ date: Date) -> Int {
        let calendar = NSCalendar.current
    
        // Replace the hour (time) of both dates with 00:00
        let date1 = calendar.startOfDay(for: date)
        let date2 = calendar.startOfDay(for: self)
    
        let components = calendar.dateComponents([.day], from: date1, to: date2)
    
        return components.day ?? 0  // This will return the number of day(s) between dates
      }
    }}
    

    事实上,在他们选择之前不可能得到日期。而且,根据更改月份之前下个月的天数不可用,我无法使用UIDatePicker来处理它

    最后我实现了我的自定义UIPickerView

    正如@holex所说


    谢谢大家的回答。

    您是否为日期选择器设置了最小和最大日期?请根据您的逻辑将最小日期设置为当前日期,将最大日期设置为。@是的,我设置了,但我想自动更改月份!请您在我的示例中深入了解一下好吗?您的主要问题是您的用户无法在
    UIDatePicker
    中同时更改月份和日期,您需要实现自己的
    UIPickerView
    仅包含这7天的内容,以便您的用户可以顺利滚动;这项工作不太复杂,但在完成选择后,您需要从当前行提取/创建/转换一个
    Date()
    对象。@holex是的,我昨天终于这样做了。事实上,在他们选择之前不可能得到日期。根据更改月份前下个月的天数不可用,我无法使用UIDatePicker处理。我已设置了最大和最小日期。这个问题是另外一个问题,请你在我的例子中更深入地看一看好吗?非常感谢你的回答,但我认为除了@holex之外,没有人知道主要的问题。