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)
我正在写这个答案,因为这是唯一的办法,不给你从NSDateComponent
variables的选项和/或强制解开这些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")