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的年/月/日这样简单的事情来说,这看起来很麻烦。 还有其他解决方案吗?


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

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


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

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

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

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


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

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

你只需要注意: NSDateComponents不会包含你要求的任何字段的有效信息,除非你使用该有效信息生成它们(即请求NSCalendar提供NSCalendarUnit的信息)。 NSDateComponents本身不包含任何参考信息 - 它们只是简单的结构,可以存储数字供您访问。 如果你还想获得一个时代,例如,在NSDateComponents ,你必须用NSCalendarUnitEra标志从NSCalendar提供生成器方法。


你可以使用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的优秀(和工作!)代码,以下是样本帮助类的样子,以返回给定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会高兴地接受这样的代码(没有任何错误或警告),但其结果是彩票。 您必须使用“比较”函数来比较NSDates:

if ([date1 compare:date2] == NSOrderedDescending) {
    // date1 is greater than date2        
}
链接地址: http://www.djcxy.com/p/85171.html

上一篇: NSDate get year/month/day

下一篇: Save string to the NSUserDefaults?