การคำนวณอายุจากตัวเลือกวันที่ Swift 3

ในโค้ดของฉันด้านล่าง ฉันได้ใช้ตัวเลือกวันที่เพื่อเป็นมุมมองย่อยของฟิลด์ข้อความของฉัน ฉันติดอยู่กับฟังก์ชันนี้ 'ยืนยันอายุ' คำสั่ง if ในฟังก์ชันทำงานได้ดีและจะเปลี่ยนสีฟิลด์ข้อความเมื่อวันที่ของตัวเลือกวันที่อยู่เหนือหรือต่ำกว่าวันที่ที่ระบุ แต่จะใช้ได้เฉพาะกับปีที่เกี่ยวข้องเท่านั้น แต่ใช้ไม่ได้กับวันที่แน่นอน ฉันได้ลองค้นหามาสองวันแล้วและไม่พบวิธีแก้ไขปัญหาที่แท้จริงของฉัน

 class AgeConfirmViewController: UIViewController, UITextFieldDelegate   {

@IBOutlet weak var txtAgeConfirmation: UITextField!
let datePicker: UIDatePicker = UIDatePicker()

 override func viewDidLoad() {
    super.viewDidLoad()
    txtAgeConfirmation.delegate = self
    createDatePicker()
    }

    func textFieldDidBeginEditing(_ textField: UITextField) {
    txtAgeConfirmation.inputView = datePicker
    datePicker.addTarget(self, action: #selector(self.datePickerChanged(sender:)), for: .valueChanged)
 }



   func datePickerChanged(sender: UIDatePicker) {
    let formatter = DateFormatter()
    formatter.timeStyle = .none
    formatter.dateStyle = .long
    txtAgeConfirmation.text = formatter.string(from: sender.date)
    verifyAge()
}


  func createDatePicker() {
    datePicker.datePickerMode = .date
    datePicker.maximumDate = Calendar.current.date(byAdding: .year, value: 0, to: Date())
}


 func verifyAge() {

    let dateOfBirth = datePicker.date
    let today = Date()
    let gregorian = NSCalendar(identifier: NSCalendar.Identifier.gregorian)
    let age = gregorian?.components([.month, .day, .year], from: dateOfBirth, to: today, options:[])

      if (age?.year)! < 21 {


        txtAgeConfirmation.textColor = UIColor.red

    } else if (age?.year)! > 21 {

        txtAgeConfirmation.textColor = UIColor.black

    }
}

person pjunior    schedule 06.01.2017    source แหล่งที่มา
comment
โปรดชี้แจงหากคุณต้องการให้ถึงวันที่ หมายความว่าถ้าอายุ 19y 11hr 59m พวกเขาไม่ได้กินคนอายุ 20y แต่สิ่งที่คุณจะได้คือปีนี้พวกเขาจะอายุ 20 ปี แต่ยังไม่ถึง 20 ปี   -  person MwcsMac    schedule 06.01.2017
comment
มันมีการชี้แจง 'ใช้ได้เฉพาะกับปีที่เกี่ยวข้องเท่านั้น แต่ใช้ไม่ได้กับวันที่แน่นอน' ฉันอยากให้มันเป็นวันที่แน่นอนใช่   -  person pjunior    schedule 06.01.2017
comment
ลองใช้รหัสนี้: stackoverflow.com/questions/27182023/   -  person dahiya_boy    schedule 06.01.2017


คำตอบ (1)


วิธีแก้ไขง่ายๆ ไม่ต้องสนใจ day และ month:

let gregorian = Calendar(identifier: .gregorian)
let ageComponents = gregorian.dateComponents([.year], from: dateOfBirth, to: Date())
let age = ageComponents.year!

txtAgeConfirmation.textColor = age < 21 ? .red : .black

หรือถ้าอยากจะละเลยเวลา

let ageComponents = calendar.dateComponents([.year], from: calendar.startOfDay(for: dateOfBirth), to: calendar.startOfDay(for: Date()))

ใน Swift 3 มีคำถามและเครื่องหมายอัศเจรีย์น้อยกว่าโดยใช้ Calendar struct แบบเนทีฟ
เครื่องหมายอัศเจรีย์อายุหลัง year นั้นปลอดภัยอย่างแน่นอน เนื่องจากมีการระบุองค์ประกอบ year ไว้อย่างชัดเจน

person vadian    schedule 06.01.2017
comment
xcode แจ้งให้ฉันเพิ่มเครื่องหมายอัศเจรีย์ และฉันมีเวลาเพียงหนึ่งปีก่อนที่จะส่งคำถามนี้ ฉันคิดว่าการเพิ่มเดือนและวันจะช่วยแก้ปัญหาได้ แต่ก็ไม่ได้เป็นเช่นนั้น ฉันเพิ่งเปลี่ยนอีกครั้งและปัญหายังคงอยู่ .. - person pjunior; 06.01.2017
comment
ฉันไม่แน่ใจว่าคุณคาดหวังผลลัพธ์อะไร ฉันอัปเดตคำตอบด้วยตัวเลือกอื่นแล้ว - person vadian; 06.01.2017
comment
การเพิ่มรหัสที่คุณอัปเดตช่วยได้ ฉันหายไปจาก 'startOfDay' ขอบคุณ - person pjunior; 06.01.2017