NSDate得到年/月/日

如果没有其他信息,我怎么能得到一个NSDate对象的年/月/日? 我意识到我可以用类似这样的方式做到这一点:

 NSCalendar *cal = [[NSCalendar alloc] init]; NSDateComponents *components = [cal components:0 fromDate:date]; int year = [components year]; int month = [components month]; int day = [components day]; 

但是对于像NSDate的年/月/日那样简单的事情来说,这似乎是一大麻烦。 有没有其他解决scheme?

因为这显然是我最受欢迎的答案,所以我会尝试编辑它以包含更多的信息。

尽pipe它的名字, NSDate本身只是机器时间的一个点,而不是date。 NSDate指定的时间点与年,月或日不相关。 为此,你必须参考一个日历。 任何给定的时间点将根据您正在查看的日历来返回不同的date信息(例如,在公历和犹太历中date不相同),而公历是日历中使用最广泛的日历世界 – 我假设 – 我们有点偏见, NSDate应该始终使用它。 幸运的是, NSDate更是两党合作。


获取date和时间将不得不通过NSCalendar ,正如你所提到的,但有一个更简单的方法来做到这一点:

 NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]]; 

这将生成一个NSDateComponents对象,其中包含当天系统日历中的date,月份和年份。 ( 注意:这不一定是当前用户指定的日历,只是默认的系统之一。)

当然,如果您使用不同的日历或date,则可以轻松更改。 可用的日历和日历单元列表可以在NSCalendar类参考中find 。 有关NSDateComponents更多信息可以在NSDateComponents类参考中find 。


作为参考,从NSDateComponents访问单个组件非常容易:

 NSInteger day = [components day]; NSInteger month = [components month]; NSInteger year = [components year]; 

你只需要注意: NSDateComponents将不会包含你要求的任何领域的有效信息,除非你用这个有效的信息(即请求NSCalendar提供NSCalendarUnit的信息NSCalendarUnit )生成它们。 NSDateComponents本身不包含任何参考信息 – 它们只是简单的结构,可以存储数字供您访问。 如果你也想得到一个时代,例如,从NSDateComponents ,你将不得不从NSCalendar NSCalendarUnitEra标志饲料生成器方法。

您可以使用NSDateFormatter获取单独的NSDate组件:

 NSDateFormatter *df = [[NSDateFormatter alloc] init]; [df setDateFormat:@"dd"]; myDayString = [df stringFromDate:[NSDate date]]; [df setDateFormat:@"MMM"]; myMonthString = [df stringFromDate:[NSDate date]]; [df setDateFormat:@"yy"]; myYearString = [df stringFromDate:[NSDate date]]; 

如果你想获得月份的数字而不是缩写,使用“MM”。 如果你想获得整数,使用[myDayString intValue];

只是为了重新说明Itai的优秀(和工作!)代码,这里是一个样本助手类看起来像返回给定的NSDatevariables的年份值。

正如你所看到的,很容易修改这个代码来获取月份或date。

 +(int)getYear:(NSDate*)date { NSDateComponents *components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:date]; int year = [components year]; int month = [components month]; int day = [components day]; return year; } 

(我不敢相信我们在2013年要写这样的基本的iOSdate函数…)

另一件事:不要用<和>来比较两个NSDate值。

XCode会高兴地接受这样的代码(没有任何错误或警告),但其结果是彩票。 您必须使用“比较”function比较NSDates:

 if ([date1 compare:date2] == NSOrderedDescending) { // date1 is greater than date2 } 

在Swift 2.0中:

  let date = NSDate() let calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)! let components = calendar.components([.Month, .Day], fromDate: date) let (month, day) = (components.month, components.day) 

我正在写这个答案,因为这是唯一的办法,不给你从NSDateComponentvariables的选项和/或强制解开这些variables(也适用于Swift 3)。

Swift 3

 let date = Date() let cal = Calendar.current let year = cal.component(.year, from: date) let month = cal.component(.month, from: date) let day = cal.component(.day, from: date) 

Swift 2

 let date = NSDate() let cal = NSCalendar.currentCalendar() let year = cal.component(.Year, fromDate: date) let month = cal.component(.Month, fromDate: date) let day = cal.component(.Day, fromDate: date) 

奖金斯威夫特3有趣的版本

 let date = Date() let component = { (unit) in return Calendar.current().component(unit, from: date) } let year = component(.year) let month = component(.month) let day = component(.day) 

新的在iOS 8

ObjC

 NSDate *date = [NSDate date]; NSInteger era, year, month, day; [[NSCalendar currentCalendar] getEra:&era year:&year month:&month day:&day fromDate:date]; 

迅速

 let date = NSDate.init() var era = 0, year = 0, month = 0, day = 0 NSCalendar.currentCalendar().getEra(&era, year:&year, month:&month, day:&day, fromDate: date) 

如果您的目标是iOS 8+,则可以使用新的NSCalendar便捷方法以更简洁的格式实现此目标。

首先创build一个NSCalendar并使用任何NSDate是必需的。

 NSCalendar *calendar = [NSCalendar currentCalendar]; NSDate *date = [NSDate date]; 

您可以通过component:fromDate:单独提取component:fromDate:

 NSInteger year = [calendar component:NSCalendarUnitYear fromDate:date]; NSInteger month = [calendar component:NSCalendarUnitMonth fromDate:date]; NSInteger day = [calendar component:NSCalendarUnitDay fromDate:date]; 

或者,更简洁地说,通过getEra:year:month:day:fromDate:使用NSInteger指针getEra:year:month:day:fromDate:

 NSInteger year, month, day; [calendar getEra:nil year:&year month:&month day:&day fromDate:date]; 

有关更多信息和示例,请查看iOS 8中的NSDate简化操作 。 免责声明,我写了这个post。

如果你想从NSDate获得单独的NSDateComponents,你肯定需要Itai Ferberbuild议的解决scheme。 但是如果你想从NSDate直接到NSString,你可以使用NSDateFormatter 。

  NSDate *currDate = [NSDate date]; NSCalendar* calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents* components = [calendar components:NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit fromDate:currDate]; NSInteger day = [components day]; NSInteger month = [components month]; NSInteger year = [components year]; NSLog(@"%d/%d/%d", day, month, year); 

Swift中的解决scheme如下:

 let todayDate = NSDate() let calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)! // Use a mask to extract the required components. Extract only the required components, since it'll be expensive to compute all available values. let components = calendar.components(.CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay, fromDate: todayDate) var (year, month, date) = (components.year, components.month, components.day) 

从iOS 8.0(和OS X 10)开始,可以使用组件方法来简化获取单个date组件,如下所示:

 int year = [[NSCalendar currentCalendar] component:NSCalendarUnitYear fromDate:[NSDate date]]; 

应该使事情变得简单,希望这是有效的实施。

尝试以下操作:

  NSString *birthday = @"06/15/1977"; NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"MM/dd/yyyy"]; NSDate *date = [formatter dateFromString:birthday]; if(date!=nil) { NSInteger age = [date timeIntervalSinceNow]/31556926; NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:date]; NSInteger day = [components day]; NSInteger month = [components month]; NSInteger year = [components year]; NSLog(@"Day:%d Month:%d Year:%d Age:%d",day,month,year,age); } [formatter release]; 

Swift 2.x

 extension NSDate { func currentDateInDayMonthYear() -> String { let dateFormatter = NSDateFormatter() dateFormatter.dateFormat = "d LLLL yyyy" return dateFormatter.stringFromDate(self) } } 

你可以使用它

 NSDate().currentDateInDayMonthYear() 

产量

 6 March 2016 

尝试这个 。 。 。

代码片段:

  NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]]; int year = [components year]; int month = [components month]; int day = [components day]; 

它给出当前的年份,月份,date

我这样做…

 NSDate * mydate = [NSDate date]; NSCalendar * mycalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSCalendarUnit units = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay; NSDateComponents * myComponents = [mycalendar components:units fromDate:mydate]; NSLog(@"%d-%d-%d",myComponents.day,myComponents.month,myComponents.year); 

要获取可读的string(日,月,年),您可以:

 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateStyle:NSDateFormatterMediumStyle]; NSString *string = [dateFormatter stringFromDate:dateEndDate]; 

迅速

更简单的方法来获取date的任何元素作为一个可选的string。

 extension Date { // Year var currentYear: String? { return getDateComponent(dateFormat: "yy") //return getDateComponent(dateFormat: "yyyy") } // Month var currentMonth: String? { return getDateComponent(dateFormat: "M") //return getDateComponent(dateFormat: "MM") //return getDateComponent(dateFormat: "MMM") //return getDateComponent(dateFormat: "MMMM") } // Day var currentDay: String? { return getDateComponent(dateFormat: "dd") //return getDateComponent(dateFormat: "d") } func getDateComponent(dateFormat: String) -> String? { let format = DateFormatter() format.dateFormat = dateFormat return format.string(from: self) } } let today = Date() print("Current Year - \(today.currentYear)") // result Current Year - Optional("2017") print("Current Month - \(today.currentMonth)") // result Current Month - Optional("7") print("Current Day - \(today.currentDay)") // result Current Day - Optional("10")