Nurdin
Nurdin

Reputation: 23893

Calculate age from birth date

I can't find age in from birth date. What I got is

fatal error: unexpectedly found nil while unwrapping an Optional value
(lldb) 

My code

override func viewDidLoad() {
        super.viewDidLoad()
var dateString = user.birthday
        var dateFormatter = NSDateFormatter()
        // this is imporant - we set our input date format to match our input string
        dateFormatter.dateFormat = "dd-MM-yyyy"
        // voila!
        var dateFromString = dateFormatter.dateFromString(dateString)
        
        let age = calculateAge(dateFromString!)
}

func calculateAge (birthday: NSDate) -> NSInteger {
        
        var userAge : NSInteger = 0
        var calendar : NSCalendar = NSCalendar.currentCalendar()
        var unitFlags : NSCalendarUnit = NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay
        var dateComponentNow : NSDateComponents = calendar.components(unitFlags, fromDate: NSDate())
        var dateComponentBirth : NSDateComponents = calendar.components(unitFlags, fromDate: birthday)
        
        if ( (dateComponentNow.month < dateComponentBirth.month) ||
            ((dateComponentNow.month == dateComponentBirth.month) && (dateComponentNow.day < dateComponentBirth.day))
            )
        {
            return dateComponentNow.year - dateComponentBirth.year - 1
        }
        else {
            return dateComponentNow.year - dateComponentBirth.year
        }
    }

Upvotes: 10

Views: 12581

Answers (4)

Leo Dabus
Leo Dabus

Reputation: 236420

update: Xcode 11 • Swift 5.1

You can use the Calendar method dateComponents to calculate how many years from a specific date to today:

extension Date {
    var age: Int { Calendar.current.dateComponents([.year], from: self, to: Date()).year! }
}

let dob = DateComponents(calendar: .current, year: 2000, month: 6, day: 30).date!
let age = dob.age // 19

enter image description here

Upvotes: 33

George Filippakos
George Filippakos

Reputation: 16569

Important:

The timezone must be set to create a UTC birth date otherwise there will be inconsistencies between timezones.

Swift 3

extension Date {

    //An integer representation of age from the date object (read-only).
    var age: Int {
        get {
            let now = Date()
            let calendar = Calendar.current

            let ageComponents = calendar.dateComponents([.year], from: self, to: now)
            let age = ageComponents.year!
            return age
        }
    }

    init(year: Int, month: Int, day: Int) {
        var dc = DateComponents()
        dc.year = year
        dc.month = month
        dc.day = day

        var calendar = Calendar(identifier: .gregorian)
        calendar.timeZone = TimeZone(secondsFromGMT: 0)!
        if let date = calendar.date(from: dc) {
            self.init(timeInterval: 0, since: date)
        } else {
            fatalError("Date component values were invalid.")
        }
    }

}

Usage:

let dob = Date(year: 1975, month: 1, day: 1)
let age = dob.age

print(age)

Upvotes: 2

ykonda
ykonda

Reputation: 527

Just use the DateTools pod. Absolutely the easiest way. https://github.com/MatthewYork/DateTools

For Swift 3

import DateTools

let birthday: Date = ....
let ageString = String((Date() as NSDate).years(from: birthday))

Upvotes: -1

Struchu
Struchu

Reputation: 76

In Swift 2.0+ age computing code should look something like this:

extension NSDate {
    var age:Int {
        return NSCalendar.currentCalendar()
            .components(NSCalendarUnit.Year, 
                        fromDate: self, 
                        toDate: NSDate(),
                        options: NSCalendarOptions(rawValue: 0)
            .year
    }
}

Upvotes: 0

Related Questions