2015-03-09 44 views
5

Tôi không thể tìm thấy tuổi từ ngày sinh. Những gì tôi nhận được làTính tuổi từ ngày sinh

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

Mã của tôi

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 
     } 
    } 
+0

On mà dòng nào bạn nhận được lỗi? Và nội dung của dateString là gì? –

+0

Có thể 'let age = calculateAge (dateFromString!)' Sẽ gây ra vấn đề này. Khó có thể đề xuất giải pháp mà không biết 'dateString' chứa –

Trả lời

21

update: Xcode 8.2.1 • Swift 3.0.2

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

let myDOB = Calendar.current.date(from: DateComponents(year: 1970, month: 9, day: 10))! 

let myAge = myDOB.age  // 46 

Xcode 7.2 • Swift 2.1.1

Bạn có thể sử dụng phương pháp NSCalendar c omponents để tính toán bao nhiêu năm kể từ một ngày cụ thể đến ngày hôm nay như sau:

extension NSDate { 
    var age: Int { 
     return NSCalendar.currentCalendar().components(.Year, fromDate: self, toDate: NSDate(), options: []).year 
    } 
} 

let myDOB = NSCalendar.currentCalendar().dateWithEra(1, year: 1970, month: 09, day: 10, hour: 0, minute: 0, second: 0, nanosecond: 0)! 
let myAge = myDOB.age  // 46 
+0

bạn có thể chỉ cho tôi mã đầy đủ –

+0

để mã cập nhật của bạn như thế nào? –

+0

Làm thế nào để đạt được trong Swift2 @SwiftArchitect? – NiKKi

0

Trong Swift đang tính toán tuổi 2.0+ nên tìm một cái gì đó như thế này:

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

Chỉ cần sử dụng DateTools pod. Tuyệt đối là cách dễ nhất. https://github.com/MatthewYork/DateTools

Đối Swift 3

import DateTools 

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

Chú ý:

Các múi giờ phải được thiết lập để tạo ra một ngày UTC sinh nếu không sẽ có mâu thuẫn giữa các múi giờ.

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.") 
     } 
    } 

} 

Cách sử dụng:

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

print(age) 
Các vấn đề liên quan