【问题标题】:How to calculate the age based on NSDate如何根据 NSDate 计算年龄
【发布时间】:2011-05-26 17:17:42
【问题描述】:

如何根据出生日期计算年龄,格式为 6/24/1976 星期一/日期/年...

【问题讨论】:

  • 我们不介意帮助人们做作业,但我们希望他们承认这就是事实。我们希望他们在自己解决问题方面表现出某种努力。
  • 我想基本算法会类似于age = current_date - birth_date
  • 出生日期必须是d/m/y格式吗?
  • 你为什么不按照你认为应该做的方式发布呢?然后,我们将为您提供帮助。

标签: ios date nsdate foundation


【解决方案1】:

其中许多答案没有正确考虑闰年等,最好使用 Apple 的方法而不是除以常数。

斯威夫特

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

目标-C

NSDate* birthday = ...;

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

我认为这比这里的任何其他答案都更清晰、更准确。

编辑

通过将birthdaynow 都设置为中午来提高准确性。这是使用Date 扩展(在 Swift 中)的一种方法...

/// Returns a new date identical to the receiver except set to precisely noon.
/// Example: let now = Date().atNoon()
func atNoon() -> Date {
    var components = (Calendar.current as NSCalendar).components([.day, .month, .year, .era, .calendar, .timeZone], from: self)
    components.hour = 12
    components.minute = 0
    components.second = 0
    components.nanosecond = 0
    return Calendar.current.date(from: components)!
}

【讨论】:

  • 哇!很好的答案!这值得一个自我面对手掌:D!
  • 这帮助我获得了 int 的年龄。在我的情况下,我还必须在使用它之前从字符串转换日期: NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; [dateFormat setDateFormat:@"MM/dd/yyyy"]; NSDate *birthday = [dateFormat dateFromString:@"11/19/1986"];
  • ofc 我必须添加这应该是正确的答案
  • 干得好,自从你回答以来一直在使用它!谢谢!
  • @MurraySagal 这应该被编辑成答案! nowbirthday 同时开始是至关重要的,因为我们人类计算年龄的方式有一个怪癖:这是你的生日整天不管你实际出生的时间在。
【解决方案2】:

以下是根据您的出生日期(以年和日为单位)计算实际年龄的方法:

NSString *birthDate = @"03/31/1990";    
NSDate *todayDate = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MM/dd/yyyy"];
int time = [todayDate timeIntervalSinceDate:[dateFormatter dateFromString:birthDate]];
int allDays = (((time/60)/60)/24);
int days = allDays%365;
int years = (allDays-days)/365;

NSLog(@"You live since %i years and %i days",years,days);

它返回年份和确切的日期。如果您需要,您可以更改 NSDateFormatter 等等。

【讨论】:

  • 你住的地方没有闰年吗? ;)
  • 我住在火星上——只是好奇号还没有发现我。我不熟悉 Objective-C 中日期计算的可能性,但我的答案是一个非常简单的解决方案,但我认为那里有一个更精确的解决方案(在你的星球上);-)
  • 您将如何使用这种方法计算月份?
【解决方案3】:

这是我从 link.. 得到的代码。它工作得很好。输出将类似于“5 年 6 个月”,所有用例都包含在其中。

- (NSString *)age:(NSDate *)dateOfBirth {
   NSInteger years;
   NSInteger months;
   NSInteger days;

   NSCalendar *calendar = [NSCalendar currentCalendar];
    unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;

   NSDateComponents *dateComponentsNow = [calendar components:unitFlags fromDate:[NSDate date]];
   NSDateComponents *dateComponentsBirth = [calendar components:unitFlags fromDate:dateOfBirth];

   if (([dateComponentsNow month] < [dateComponentsBirth month]) ||

(([dateComponentsNow month] == [dateComponentsBirth month]) && ([dateComponentsNow day] < [dateComponentsBirth day]))) {
   years = [dateComponentsNow year] - [dateComponentsBirth year] - 1;
} else {
   years = [dateComponentsNow year] - [dateComponentsBirth year];
}

if ([dateComponentsNow year] == [dateComponentsBirth year]) {
   months = [dateComponentsNow month] - [dateComponentsBirth month];
} else if ([dateComponentsNow year] > [dateComponentsBirth year] && [dateComponentsNow month] > [dateComponentsBirth month]) {
   months = [dateComponentsNow month] - [dateComponentsBirth month];
} else if ([dateComponentsNow year] > [dateComponentsBirth year] && [dateComponentsNow month] < [dateComponentsBirth month]) {
   months = [dateComponentsNow month] - [dateComponentsBirth month] + 12;
} else {
   months = [dateComponentsNow month] - [dateComponentsBirth month];
}

if ([dateComponentsNow year] == [dateComponentsBirth year] && [dateComponentsNow month] == [dateComponentsBirth month]) {
   days = [dateComponentsNow day] - [dateComponentsBirth day];
}

if (years == 0 && months == 0) {
   if (days == 1) {
      return [NSString stringWithFormat:@"%d day", days];
   } else {
      return [NSString stringWithFormat:@"%d days", days];
   }
} else if (years == 0) {
   if (months == 1) {
      return [NSString stringWithFormat:@"%d month", months];
   } else {
      return [NSString stringWithFormat:@"%d months", months];
   }
} else if ((years != 0) && (months == 0)) {
   if (years == 1) {
       return [NSString stringWithFormat:@"%d year", years];
   } else {
       return [NSString stringWithFormat:@"%d years", years];
   }
} else {
  if ((years == 1) && (months == 1)) {
      return [NSString stringWithFormat:@"%d year and %d month", years, months];
  } else if (years == 1) {
      return [NSString stringWithFormat:@"%d year and %d months", years, months];
  } else if (months == 1) {
      return [NSString stringWithFormat:@"%d years and %d month", years, months];
  } else {
      return [NSString stringWithFormat:@"%d years and %d months", years, months];
  }
}
}

如果您希望年龄为 int,请尝试以下答案.. 我从关注 link 得到的

- (NSInteger)age:(NSDate *)dateOfBirth {
  NSCalendar *calendar = [NSCalendar currentCalendar];
  unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
  NSDateComponents *dateComponentsNow = [calendar components:unitFlags fromDate:[NSDate date]];
  NSDateComponents *dateComponentsBirth = [calendar components:unitFlags fromDate:dateOfBirth];

  if (([dateComponentsNow month] < [dateComponentsBirth month]) ||
      (([dateComponentsNow month] == [dateComponentsBirth month]) && ([dateComponentsNow day] < [dateComponentsBirth day]))) {
    return [dateComponentsNow year] - [dateComponentsBirth year] - 1;
  } else {
    return [dateComponentsNow year] - [dateComponentsBirth year];
  }
}

希望这对某人有所帮助..

【讨论】:

  • 这帮助我获得了 int 的年龄。在我的情况下,我还必须在调用函数 NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 之前从字符串转换日期。 [dateFormat setDateFormat:@"MM/dd/yyyy"]; NSDate *dob = [dateFormat dateFromString:@"11/19/1986"]; NSLog(@"AGE:%d",[self age:dob]);
  • 最完整的答案也计算月份,谢谢
【解决方案4】:

如果你想单独查找年龄。使用下面的一个也包括闰年计算

- (NSInteger)age:(NSDate *)dateOfBirth {
    NSCalendar *calendar = [NSCalendar currentCalendar];
    unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
    NSDateComponents *dateComponentsNow = [calendar components:unitFlags fromDate:[NSDate date]];
    NSDateComponents *dateComponentsBirth = [calendar components:unitFlags fromDate:dateOfBirth];

    if (([dateComponentsNow month] < [dateComponentsBirth month]) ||
        (([dateComponentsNow month] == [dateComponentsBirth month]) && ([dateComponentsNow day] < [dateComponentsBirth day]))) {
        return [dateComponentsNow year] - [dateComponentsBirth year] - 1;
    } else {
        return [dateComponentsNow year] - [dateComponentsBirth year];
    }
}

【讨论】:

    【解决方案5】:

    一个简单易用的快速扩展来获取年龄/多大是NSDate

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

    示例:

    NSDate(timeIntervalSince1970:0).age // => 45 (as of nov 2015) Epoch happened 45 year ago !
    

    顺便说一句,你要小心,这是西方的年龄概念,其他一些国家的计算方式不同(例如Korea)。

    【讨论】:

      【解决方案6】:

      可能我错了,但这更简单,不是吗?

      NSTimeInterval ageInterval = [birthDate timeIntervalSinceDate:[NSDate date]];
      
      NSInteger age = ABS(ageInterval / (60 * 60 * 24 * 365));
      

      【讨论】:

      • 如果是闰年怎么办?
      • 比较简单,不准确:-)
      【解决方案7】:

      基于cobbal's solutionSwift 3+语法中的方法。

      func calculateAgeInYearsFromDateOfBirth (birthday: Date) -> Int {
              let now = Date()
              let calendar = Calendar.current
      
              let ageComponents = calendar.dateComponents([.year], from: birthday, to: now)
              let age = ageComponents.year!
              return age
          }
      

      【讨论】:

        【解决方案8】:

        最简单的方法是使用 NSCalendar:

        NSDate *_dateOfBirth = ...;
        NSDateComponent *_diff = [[NSCalendar currentCalendar] components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:_dateOfBirth toDate:[NSDate date] options:0];
        
        NSLog(@"%@", _diff);
        

        【讨论】:

          【解决方案9】:
             -(NSInteger) ComputeYearMonth
              {
            NSDateFormatter *format = [[NSDateFormatter alloc] init];
          [format setDateFormat:@"yyyy-MM-dd"];
          
          NSDate *DateOfBirth=[format dateFromString:[NSString stringWithFormat:@"%@-%@-%@",year,month,day]];
          NSDate *currentTime = [NSDate date];
          
          NSLog(@"DateOfBirth======%@",DateOfBirth);
          
          NSInteger years = [[[NSCalendar currentCalendar] components:NSYearCalendarUnit
                                                             fromDate:DateOfBirth
                                                               toDate:currentTime options:0]year];
          
          NSInteger months = [[[NSCalendar currentCalendar] components:NSMonthCalendarUnit
                                                              fromDate:DateOfBirth
                                                                toDate:currentTime options:0]month];
          NSLog(@"Number of years: %d",years);
          NSLog(@"Number of Months: %d,",months);
          
          
          
              return years;
            // End of Method
            }
          

          【讨论】:

            【解决方案10】:

            这是一个计算年龄的函数(Swift 2.1)

            func calculateAge (birthday: NSDate) -> NSInteger {
            
                let calendar : NSCalendar = NSCalendar.currentCalendar()
                let unitFlags : NSCalendarUnit = [NSCalendarUnit.Year, NSCalendarUnit.Month, NSCalendarUnit.Day]
                let dateComponentNow : NSDateComponents = calendar.components(unitFlags, fromDate: NSDate())
                let 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
                }
            }
            

            【讨论】:

              【解决方案11】:
              let birthday = NSCalendar.currentCalendar().dateWithEra(1, year: 2016, month: 07, day: 25, hour: 8, minute: 53, second: 0, nanosecond: 0)!
              
              func calculateAge(birthday: NSDate) -> String {
              
              func grammaticalString(forUnit unit: String, value: Int) -> String {
                  if value > 1 {
                      return "\(value) \(unit)s"
                  } else {
                      return "\(value) \(unit)"
                  }
              }
              
              let calendar = NSCalendar.currentCalendar()
              let unitFlags: NSCalendarUnit = [NSCalendarUnit.Year, NSCalendarUnit.Month, NSCalendarUnit.Day, NSCalendarUnit.Hour, NSCalendarUnit.Minute]
              
              let ageComponent = calendar.components(unitFlags, fromDate: birthday, toDate: NSDate(), options: [])
              let years = ageComponent.year
              let months = ageComponent.month
              let days = ageComponent.day
              let hours = ageComponent.hour
              
              switch (years, months, days, hours) {
                  case (let y, let m, _, _) where y > 0:
                      return "\(grammaticalString(forUnit: "Year", value: y)) \(grammaticalString(forUnit: "Month", value: m))"
              
                  case (let y, let m, let d, _) where y == 0 && m > 0:
                      return "\(grammaticalString(forUnit: "Month", value: m)) \(grammaticalString(forUnit: "Day", value: d))"
              
                  case (let y, let m, let d, _) where y == 0 && m == 0 && d > 0:
                      return "\(grammaticalString(forUnit: "Day", value: d))"
              
                  case (let y, let m, let d, let h) where y == 0 && m == 0 && d == 0 && h > 0:
                      return "\(grammaticalString(forUnit: "Hour", value: h))"
              
                  case (let y, let m, let d, let h) where y == 0 && m == 0 && d == 0 && h == 0:
              
                      if ageComponent.minute > 0 {
                          return "\(grammaticalString(forUnit: "Minute", value: ageComponent.minute))"
                      } else {
                          return "-"
                      }
              
                  default:
                      return "-"
              }
              
              }
              
              // Output will be any of these
              // 2 Years 3 Months
              // 3 Months 0 Days
              // 2 Days
              // 3 Hours
              // 45 Minutes
              // -
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2023-03-14
                • 2013-10-31
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多