通过NSCalendar与NSDate的年月日时分秒等元素进行交互

By | 2012 年 9 月 12 日

在iOS中,表示时间的类是NSDate,但是NSDate仅仅保存了一个时刻(据1970年1月1日凌辰开始的秒数)。
想获取这个时刻的年,月,日,时,分,秒等等信息,光从NSDate是不行的。
而获取这些元素的途径是通过NSCalendar类来进行的。


下面的代码展示了如何从一个NSDate获取这些元素,并通过指定的元素来创建NSDate对象

//首先创建NSCalendar的实例,可以简单的用当前实例,也可以创建其它的历法对应的实例。
NSCalendar *cal = [NSCalendar currentCalendar];

//下面通过NSCalendar来获取各个元素,保存在类NSDateComponents的实例中
//需要通过函数参数components指定希望获取的元素,详细的枚举后面会列出
NSDateComponents *dateComps = [cal components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit fromDate:startDate];
int year = [dateComps year];
int month = [dateComps month];
int day = [dateComps day];
int hour = [dateComps hour];
int minute = [dateComps minute];
int second = [dateComps second];

//也可以通过NSCanlendar和NSDateComponents来创建NSDate
NSDate *newDate = [cal dateFromComponents:dateComps];
 <br \>

可用的元素枚举定义如下

enum {
    NSEraCalendarUnit = kCFCalendarUnitEra,
    NSYearCalendarUnit = kCFCalendarUnitYear,
    NSMonthCalendarUnit = kCFCalendarUnitMonth,
    NSDayCalendarUnit = kCFCalendarUnitDay,
    NSHourCalendarUnit = kCFCalendarUnitHour,
    NSMinuteCalendarUnit = kCFCalendarUnitMinute,
    NSSecondCalendarUnit = kCFCalendarUnitSecond,
    NSWeekCalendarUnit = kCFCalendarUnitWeek /* NS_DEPRECATED(10_4, 10_7, 2_0, 5_0) */,
    NSWeekdayCalendarUnit = kCFCalendarUnitWeekday,
    NSWeekdayOrdinalCalendarUnit = kCFCalendarUnitWeekdayOrdinal,
#if MAC_OS_X_VERSION_10_6 <= MAC_OS_X_VERSION_MAX_ALLOWED || __IPHONE_4_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED
    NSQuarterCalendarUnit = kCFCalendarUnitQuarter,
#endif
#if MAC_OS_X_VERSION_10_7 <= MAC_OS_X_VERSION_MAX_ALLOWED || __IPHONE_5_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED
    NSWeekOfMonthCalendarUnit = kCFCalendarUnitWeekOfMonth,
    NSWeekOfYearCalendarUnit = kCFCalendarUnitWeekOfYear,
    NSYearForWeekOfYearCalendarUnit = kCFCalendarUnitYearForWeekOfYear,
#endif
#if MAC_OS_X_VERSION_10_7 <= MAC_OS_X_VERSION_MAX_ALLOWED || __IPHONE_4_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED
        NSCalendarCalendarUnit = (1 << 20),
        NSTimeZoneCalendarUnit = (1 << 21),
#endif
};
typedef NSUInteger NSCalendarUnit;

发表评论

电子邮件地址不会被公开。 必填项已用*标注