【问题标题】:Compare Current Date to DatePicker Value in Swift将当前日期与 Swift 中的 DatePicker 值进行比较
【发布时间】:2015-02-22 22:37:25
【问题描述】:

在我的应用中,用户可以选择他们是否未满 18 岁或超过 18 岁。用户使用日期选择器输入他们的出生日期。我需要创建一个函数,将 MM/DD/YYYY 格式的当前日期与 DatePicker 日期进行比较,以查看用户输入的年龄是否超过 18 岁。

我当前将 DatePicker 文本设置为关联文本字段的函数是:

func updatePicker() {
    var dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "MM/dd/yyyy"
    dob.text = dateFormatter.stringFromDate(datePickerView.date)
}

当用户尝试进入下一页时,表单会得到验证,此时我需要比较日期并在未满 18 岁时显示警报。

只是不确定从哪里开始评估日期字符串。

【问题讨论】:

    标签: ios swift uidatepicker


    【解决方案1】:

    使用此功能比较日期

    func compareDate(date1: NSDate!, toDate date2: NSDate!, toUnitGranularity unit: NSCalendarUnit) -> NSComparisonResult
    

    看到这个question

    【讨论】:

      【解决方案2】:

      您可以使用 NSCalendar components 方法并提取两个日期的 NSCalendarUnit.CalendarUnitYear 差异:

      extension NSDate {
          var is18yearsOld:Bool {
              return NSDate().yearsFrom(self) > 18
          }
          func yearsFrom(date:NSDate)   -> Int { return NSCalendar.currentCalendar().components(NSCalendarUnit.CalendarUnitYear, fromDate: date, toDate: self, options: nil).year }
      }
      
      let dob1 = NSCalendar.currentCalendar().dateWithEra(1, year: 1970, month: 3, day: 27, hour: 7, minute: 19, second: 26, nanosecond: 0)!
      let dob2 = NSCalendar.currentCalendar().dateWithEra(1, year: 2000, month: 3, day: 27, hour: 7, minute: 19, second: 26, nanosecond: 0)!
      let is18years1 = dob1.is18yearsOld    // true
      let is18years2 = dob2.is18yearsOld    // false
      

      【讨论】:

        【解决方案3】:

        不要将日期转换为文本,然后再将文本转换为日期。 只需保留 datePicker 中的日期,直到您需要它进行验证。

        有一个成员变量var selectedDate : NSDate?

        然后再检查是否超过 18 岁就可以了

        if let userDate=self.selectedDate {
            if(NSDate().timeIntervalSinceDate(userDate) >= (568024668 /*18 years in seconds*/) {
                .... /*is 18*/
            }
        }
        

        【讨论】:

        • 这是一个非常简单的解决方案,但是我发现一个问题是,如果今天是用户的 18 岁生日,则表示他们还不到 18 岁。似乎需要 -/+ 1天,但我不确定我对修改它只是为了让它工作感觉如何。
        • 哦,我知道,哈哈。我只是不希望有人利用这一点。我会试一试,看看它在几个测试中的评估结果。
        • 虽然这是错误的.. 不要做 -1 天 .. 你想要什么而不是将当前日期舍入到午夜 - 使用 NSDateComponents
        【解决方案4】:

        首先,您必须使用日历组件方法将日期的一部分作为 Int 类型:

        // Current date
        let currentDate = Date()
        let calendar = Calendar.current
                        
        let currentYear = calendar.component(.year, from: currentDate) //year: Int
        let currentMonth = calendar.component(.month, from: currentDate) //month: Int
        let currentDay = calendar.component(.day, from: currentDate) //day: Int
        
        
        // DatePicker's date
        let yearFromDatePicker = calendar.component(.year, from: datePicker.date) //year: Int
        let monthFromDatePicker = calendar.component(.month, from: datePicker.date) //month: Int
        let dayFromDatePicker = calendar.component(.day, from: datePicker.date) //day: Int
        

        然后您可以根据自己的条件比较日期的各个部分。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-02-14
          • 2017-05-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多