ios 如何根据NSDate计算年龄
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4463893/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to calculate the age based on NSDate
提问by Linux world
how to calculate the age based on the birth date in this format 6/24/1976 mon/date/year...
如何以这种格式根据出生日期计算年龄 6/24/1976 mon/date/year ...
回答by cobbal
Many of these answers don't properly account for leap years and such, best is to use Apple's methods instead of dividing by constants.
这些答案中的许多都没有正确考虑闰年等,最好是使用 Apple 的方法而不是除以常数。
Swift
迅速
let birthday: NSDate = ...
let now = Date()
let ageComponents = calendar.dateComponents([.year], from: birthday, to: now)
let age = ageComponents.year
Objective-C
目标-C
NSDate* birthday = ...;
NSDate* now = [NSDate date];
NSDateComponents* ageComponents = [[NSCalendar currentCalendar]
components:NSCalendarUnitYear
fromDate:birthday
toDate:now
options:0];
NSInteger age = [ageComponents year];
I think this is cleaner and more accurate than any of the other answers here.
我认为这比这里的任何其他答案都更清晰、更准确。
Edit
编辑
Increase accuracy by setting both birthday
and now
to noon. Here is one way to do that with a Date
extension (in Swift)...
通过将birthday
和都设置now
为中午来提高准确性。这是一种使用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)!
}
回答by Fabio Poloni
Here's how you can calculate your actual age based on your birth date in years and days:
以下是根据您的出生日期(以年和天为单位)计算实际年龄的方法:
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);
It returns the years and the exact days. And if you need you can change the NSDateFormatter and much more.
它返回年份和确切日期。如果您需要,您可以更改 NSDateFormatter 等等。
回答by Dilip Rajkumar
This is the code I got from this link.. it works great.. Out put will be like "5 years 6 months" and all usecases are covered in it.
这是我从这个链接得到的代码.. 效果很好.. 输出就像“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];
}
}
}
If you want age as int try the following answer.. which I got from following link
如果您想要年龄为 int 尝试以下答案..这是我从以下链接中获得的
- (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];
}
}
Hope this helps some one..
希望这有助于某人..
回答by Antzi
A simple to use swift extension to get the age/how old is a NSDate
一个简单易用的 swift 扩展来获取年龄/年龄 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
}
}
Exemple:
例子:
NSDate(timeIntervalSince1970:0).age // => 45 (as of nov 2015) Epoch happened 45 year ago !
By the way, you should be careful, this is the western conception of age, the counting is different in some other countries (Koreafor exemple).
顺便说一句,你要小心,这是西方的年龄概念,其他一些国家(例如韩国)的计算方式不同。
回答by Asta ni enohpi
If u want to find age alone .use below one which include leap year calculation too
如果你想单独找到年龄。使用下面的一个,其中也包括闰年计算
- (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];
}
}
回答by Pedro
May be I'm wrong, but this is simpler, isn't it?
可能是我错了,但这更简单,不是吗?
NSTimeInterval ageInterval = [birthDate timeIntervalSinceDate:[NSDate date]];
NSInteger age = ABS(ageInterval / (60 * 60 * 24 * 365));
回答by Maverick
Method in Swift 3+syntax based on cobbal's solution.
在方法斯威夫特3+语法基于cobbal的解决方案。
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
}
回答by holex
the easiest way is to use the NSCalendar:
最简单的方法是使用 NSCalendar:
NSDate *_dateOfBirth = ...;
NSDateComponent *_diff = [[NSCalendar currentCalendar] components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:_dateOfBirth toDate:[NSDate date] options:0];
NSLog(@"%@", _diff);
回答by Blaine Rothrock
Here's a function to calculate age (Swift 2.1)
这是一个计算年龄的函数(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
}
}
回答by raw3d
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
// -