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的年/月/日这样简单的事情来说,这似乎是一大堆麻烦。还有其他解决办法吗?

223762 次浏览

因为这显然是我最喜欢的答案,我将试着编辑它,以包含更多的信息。

尽管它的名字,NSDate本身只是标记了机器时间中的一个点,而不是一个日期。NSDate指定的时间点与年、月或日之间没有相关性。为此,你必须参考日历。任何给定的时间点都会根据你所查看的日历返回不同的日期信息(例如,格里高利历和犹太历中的日期都不相同),虽然格里高利历是世界上使用最广泛的日历-我假设-我们有点偏见,认为NSDate应该总是使用它。幸运的是,NSDate是两党合作的。


获取日期和时间必须通过NSCalendar,正如你所提到的,但是有一个更简单的方法:

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

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

当然,如果你使用不同的日历或日期,你可以很容易地更改它。可用日历和日历单元的列表可以在NSCalendar类引用. properties中找到。关于NSDateComponents的更多信息可以在NSDateComponents类引用中找到。


作为参考,从NSDateComponents中访问单个组件相当容易:

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

你只需要注意:NSDateComponents不会包含你请求的任何字段的有效信息,除非你用有效信息生成它们(即请求NSCalendarNSCalendarUnits提供该信息)。NSDateComponents本身不包含引用信息——它们只是简单的结构,保存着供你访问的数字。例如,如果你还想从NSDateComponents中获得一个年代,你必须用NSCalendarUnitEra标志从NSCalendar中提供生成器方法。

如果你想从NSDate中获得单个的NSDateComponents,你肯定需要Itai Ferber建议的解决方案。但如果你想要从NSDate直接到NSString,你可以使用NSDateFormatter

你可以使用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的优秀(并且工作!)代码,下面是一个示例helper类的样子,它返回给定NSDate变量的一年值。

如您所见,修改这段代码以获得月或日是很容易的。

+(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年,我们还得自己编写这样的基本iOS日期函数……)

还有一件事:永远不要使用<和>来比较两个NSDate值。

XCode很乐意接受这样的代码(没有任何错误或警告),但其结果是一个彩票。你必须使用"compare"函数来比较nsdate:

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

试试下面的方法:

    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];
    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);

我这样做....

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);

试试这个……

代码片段:

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

它给出了当前的年、月、日

如果你的目标是iOS 8+,你可以使用新的NSCalendar方便方法以更简洁的格式实现这一点。

首先创建一个NSCalendar并使用所需的NSDate

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

你可以通过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指针

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

有关更多信息和示例,请查看在iOS 8中NSDate操作变得简单。免责声明,这是我写的文章。

下面是Swift的解决方案:

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)

在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)

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

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

应该使事情更简单,希望这是有效地实施。

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)

快2.倍

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

你可以用它作为

NSDate().currentDateInDayMonthYear()

输出

6 March 2016

我写这个答案,因为它是唯一的方法,不给你可选返回NSDateComponent变量和/或强制展开这些变量(也适用于Swift 3)。

斯威夫特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)

斯威夫特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)

奖金Swift 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)

要获得人类可读的字符串(日,月,年),你可以这样做:

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")