Menghitung Usia Dari Pemilih Tanggal Swift 3

Dalam kode saya di bawah ini saya telah menerapkan pemilih tanggal untuk menjadi subview dari bidang teks saya. Saya terjebak pada fungsinya; 'verifikasiUsia'. Pernyataan if dalam fungsi berfungsi dengan baik dan akan mengubah warna bidang teks ketika tanggal Pemilih Tanggal di atas atau di bawah tanggal yang ditentukan. Tapi itu hanya bekerja pada tahun yang bersangkutan Tapi tidak Bekerja pada hari yang tepat. Saya telah mencoba mencari selama dua hari terakhir dan tidak dapat menemukan solusi untuk masalah saya yang sebenarnya.

 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 sumber
comment
Harap klarifikasi jika Anda membutuhkannya untuk keperluan sehari-hari. Artinya kalau umur 19y 11hr 59m mereka tidak makan umur 20y. Sebaliknya yang Anda dapatkan adalah jika mereka berusia 20 tahun pada tahun ini tetapi belum berusia 20 tahun.   -  person MwcsMac    schedule 06.01.2017
comment
Hal ini diklarifikasi. 'itu hanya berfungsi pada tahun yang bersangkutan Tetapi Tidak Bekerja pada hari yang tepat'. Aku ingin itu terjadi pada hari yang tepat ya.   -  person pjunior    schedule 06.01.2017
comment
Coba kode ini: stackoverflow.com/questions/27182023/   -  person dahiya_boy    schedule 06.01.2017


Jawaban (1)


Solusi sederhana, abaikan day dan 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

Atau jika Anda ingin mengabaikan waktu

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

Di Swift 3, ada lebih sedikit tanda tanya dan tanda seru dengan menggunakan struct Calendar asli.
Tanda seru usia setelah year benar-benar aman karena komponen year ditentukan dengan jelas.

person vadian    schedule 06.01.2017
comment
xcode meminta saya untuk menambahkan tanda seru, dan saya hanya punya waktu satu tahun sebelum mengirimkan pertanyaan ini. Saya pikir menambahkan bulan dan hari akan menyelesaikannya tetapi ternyata tidak. Saya baru saja mengubahnya lagi dan masalahnya masih pada mereka.. - person pjunior; 06.01.2017
comment
Saya tidak yakin hasil apa yang Anda harapkan, saya memperbarui jawabannya dengan alternatif. - person vadian; 06.01.2017
comment
Menambahkan kode yang Anda perbarui membantu, saya melewatkan kode dari 'startOfDay', Terima kasih - person pjunior; 06.01.2017