【问题标题】:Calculate age from birth date using NSDateComponents in Swift在 Swift 中使用 NSDateComponents 从出生日期计算年龄
【发布时间】:2023-03-19 23:12:02
【问题描述】:

我正在尝试使用这个函数从 Swift 中的生日日期计算年龄:

var calendar : NSCalendar = NSCalendar.currentCalendar()

var dateComponentNow : NSDateComponents = calendar.components(
             NSCalendarUnit.CalendarUnitYear, 
             fromDate: birthday, 
             toDate: age, 
             options: 0)

但我收到一个错误Extra argument toDate in call

在目标 c 中这是代码,但我不知道为什么会出现此错误:

NSDate* birthday = ...;

NSDate* now = [NSDate date];
NSDateComponents* ageComponents = [[NSCalendar currentCalendar] 
                               components:NSYearCalendarUnit 
                               fromDate:birthday
                               toDate:now
                               options:0];
NSInteger age = [ageComponents year]; 

还有比这更好的正确形式吗?

【问题讨论】:

    标签: swift nsdatecomponents


    【解决方案1】:

    您收到一条错误消息,因为0 不是NSCalendarOptions 的有效值。 对于“无选项”,请使用NSCalendarOptions(0) 或直接使用nil

    let ageComponents = calendar.components(.CalendarUnitYear,
                                  fromDate: birthday,
                                    toDate: now,
                                   options: nil)
    let age = ageComponents.year
    

    (指定nil 是可能的,因为NSCalendarOptions 符合RawOptionSetType 协议,该协议又继承 来自NilLiteralConvertible。)

    Swift 2 更新:

    let ageComponents = calendar.components(.Year,
        fromDate: birthday,
        toDate: now,
        options: [])
    

    Swift 3 更新:

    假设使用了 Swift 3 类型 DateCalendar

    let now = Date()
    let birthday: Date = ...
    let calendar = Calendar.current
    
    let ageComponents = calendar.dateComponents([.year], from: birthday, to: now)
    let age = ageComponents.year!
    

    【讨论】:

    • @NaveedKhan:感谢您的编辑建议。但是,如果使用新的Date 类型而不是“旧的”NSDate,则 Swift 3 代码是正确的。如果有任何问题,请告诉我。
    • 请在 swift 3 中运行代码倒数第二行的命令... 'calendar.datecomponen't 替换为 'calendar.component'
    • @NaveedKhan:这很奇怪。我只是仔细检查了 Swift 3 代码是否在 Xcode 8.2.1 (Swift 3.0) 和 Xcode 8.3 (Swift 3.1) 中编译。您使用的是哪个 Xcode 版本?您是否尝试了上面发布的确切代码?
    【解决方案2】:

    我创建这个方法非常简单,只需将生日日期放入方法中,这将返回年龄作为 Int

    斯威夫特 3

    func calcAge(birthday: String) -> Int {
        let dateFormater = DateFormatter()
        dateFormater.dateFormat = "MM/dd/yyyy"
        let birthdayDate = dateFormater.date(from: birthday)
        let calendar: NSCalendar! = NSCalendar(calendarIdentifier: .gregorian)
        let now = Date()
        let calcAge = calendar.components(.year, from: birthdayDate!, to: now, options: [])
        let age = calcAge.year
        return age!
    }
    

    斯威夫特 2

    func calcAge(birthday: String) -> Int{
        let dateFormater = NSDateFormatter()
        dateFormater.dateFormat = "MM/dd/yyyy"
        let birthdayDate = dateFormater.dateFromString(birthday)
        let calendar: NSCalendar! = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)
        let now: NSDate! = NSDate()
        let calcAge = calendar.components(.Year, fromDate: birthdayDate!, toDate: now, options: [])
        let age = calcAge.year
        return age
    }
    

    用法

    print(calcAge("06/29/1988"))
    

    【讨论】:

    【解决方案3】:

    对于 swift 4 工作正常

    func getAgeFromDOF(date: String) -> (Int,Int,Int) {
    
        let dateFormater = DateFormatter()
        dateFormater.dateFormat = "YYYY-MM-dd"
        let dateOfBirth = dateFormater.date(from: date)
    
        let calender = Calendar.current
    
        let dateComponent = calender.dateComponents([.year, .month, .day], from: 
        dateOfBirth!, to: Date())
    
        return (dateComponent.year!, dateComponent.month!, dateComponent.day!)
    }
    
    let age  = getAgeFromDOF(date: "2000-12-01")
    
    print("\(age.0) Year, \(age.1) Month, \(age.2) Day")
    

    【讨论】:

      【解决方案4】:

      这适用于 Swift 3

      let myDOB = Calendar.current.date(from: DateComponents(year: 1994, month: 9, day: 10))!
      let myAge = Calendar.current.dateComponents([.month], from: myDOB, to: Date()).month!
      let years = myAge / 12
      let months = myAge % 12
      print("Age : \(years).\(months)")
      

      【讨论】:

        【解决方案5】:

        这对我来说适用于 swift 3..

        let now = NSDate()
            let calendar : NSCalendar = NSCalendar.current as NSCalendar
            let ageComponents = calendar.components(.year, from: datePickerView.date, to: now as Date, options: [])
            let age = ageComponents.year!
            ageCalculated.text = String(age)
        

        感谢@Martin R

        【讨论】:

          【解决方案6】:

          这是 swift 5 上最好的方法

          lazy var dateFormatter : DateFormatter = {
                  let formatter = DateFormatter()
                  formatter.dateFormat = "yyyy-MM-dd"
                  formatter.locale = Locale(identifier: "en_US_POSIX")
                  return formatter
              }()
          
          let birthday = dateFormatter.date(from: "1980-04-25")
          let timeInterval = birthday?.timeIntervalSinceNow
          let age = abs(Int(timeInterval! / 31556926.0))
          

          【讨论】:

          • 在操场上很适合我。只需创建一个 var 并连接到日期选择器并将其链接到上述代码中的出生日期。谢谢!
          【解决方案7】:

          //创建字符串扩展名更容易

          extension String {
                      func getDate(format: String) -> Date {
                          let dateFormatter = DateFormatter()
                          dateFormatter.dateFormat = format
                          dateFormatter.locale = Locale(identifier: "en_US_POSIX")
                          return dateFormatter.date(from: self) ?? Date()
                      } 
                  }
          
          1. 获取今天的日期和您的生日日期

          let today = Date()

          let birthDate = "1990-01-01".getDate(format: "yyyy-MM-dd")

          1. 创建用户当前日历的实例

          let calendar = Calendar.current

          1. 使用日历获取两个日期之间的差异

          let components = calendar.dateComponents([.year, .month, .day], from: birthDate, to: today)

          let ageYears = components.year //得到多少岁

          let ageMonths = components.month //额外的几个月

          let ageDays = components.day // 额外天数

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多