iOS 时间处理汇总

关于时间的全局变量和宏,下面方法用到。

#define DATE_COMPONENTS (NSCalendarUnitYear \
| NSCalendarUnitMonth \
| NSCalendarUnitDay \
| NSCalendarUnitWeekOfYear \
|  NSCalendarUnitHour \
| NSCalendarUnitMinute \
| NSCalendarUnitSecond \
| NSCalendarUnitWeekday \
| NSCalendarUnitWeekdayOrdinal)
#define CURRENT_CALENDAR [NSCalendar currentCalendar]


static CGFloat const D_MINUTE = 60;
static CGFloat const D_HOUR = 3600;
static CGFloat const D_DAY = 86400;
static CGFloat const D_WEEK = 604800;
static CGFloat const D_YEAR = 31556926;

获取某个时间的年、月、日、小时、分钟、秒

- (NSInteger)year
{
    NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components: DATE_COMPONENTS fromDate:self];
    return [dateComponents year];
}

- (NSInteger)month
{
    NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components: DATE_COMPONENTS fromDate:self];
    return [dateComponents month];
}

- (NSInteger)day
{
    NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components: DATE_COMPONENTS fromDate:self];
    return [dateComponents day];
}

- (NSInteger)hour
{
    NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components: DATE_COMPONENTS fromDate:self];
    return [dateComponents hour];
}

- (NSInteger)minute
{
    NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components: DATE_COMPONENTS fromDate:self];
    return [dateComponents minute];
}

- (NSInteger)second
{
    NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components: DATE_COMPONENTS fromDate:self];
    return [dateComponents second];
}
/**
 *  N'天'后日期
 */
NSDate *nextDate = [NSDate dateWithTimeInterval:D_DAY *  days sinceDate:self.currentDate];

/**
 *  N'天'前日期
 */
NSDate *nextDate = [NSDate dateWithTimeInterval: - D_DAY *  days sinceDate:self.currentDate];

全部在NSDate分类里面实现

一、月末最后一天

/**
 月末最后一天

 @param date 当前时间对象
 @return 月末日期
 */
+ (NSDate *)lastDayOfMonthWithDate:(NSDate *)date
{
    double interval = 0;
    NSDate *firstDate = nil;
    NSDate *lastDate  = nil;
    NSCalendar *calendar = [NSCalendar currentCalendar];
    
    BOOL OK = [calendar rangeOfUnit:NSCalendarUnitMonth startDate:& firstDate interval:&interval forDate:date];
    
    if (OK) {
        lastDate = [firstDate dateByAddingTimeInterval:interval - 1];
    }
    
    return lastDate;
}

二、月初第一天

/**
 月初第一天

 @param date 当前时间对象
 @return 月初日期
 */
+ (NSDate *)firstDayOfMonthWithDate:(NSDate *)date
{
    double interval = 0;
    NSDate *firstDate = nil;
    NSCalendar *calendar = [NSCalendar currentCalendar];
    
    [calendar rangeOfUnit:NSCalendarUnitMonth startDate:& firstDate interval:&interval forDate:date];
    
    return firstDate;
}

三、本周周一

/**
 本周周一 一周时间起点按周一算起(周一、周二、周三、周四、周五、周六、周日)
 
 @param date 当前时间对象
 @return 本周周一
 */
+ (NSDate *)mondayOfWeekWithDate:(NSDate *)date {
    
    NSTimeInterval interval;
    NSDate *mondayDate = nil;
    NSCalendar *calendar = [NSCalendar currentCalendar];
    [calendar setFirstWeekday:2]; //Override locale to make week start on Monday
    [calendar rangeOfUnit:NSCalendarUnitWeekOfYear startDate:& mondayDate interval:&interval forDate:date];
    return mondayDate;
}

四、本周周日

/**
 本周周日 一周时间起点按周日算起(周日、周一、周二、周三、周四、周五、周六)
 
 @param date 当前时间对象
 @return 本周周日
 */
+ (NSDate *)sundayOfWeekWithDate:(NSDate *)date {
    NSTimeInterval interval;
    NSDate *sundayDate = nil;
    NSCalendar *calendar = [NSCalendar currentCalendar];
    
    [calendar rangeOfUnit:NSCalendarUnitWeekOfYear startDate:& sundayDate interval:&interval forDate:date];
    return sundayDate;
}

五、N'月'前或者后时间

//某个时间前或者后N个月
+ (NSDate *)getForwardOrLaterDateFromDate:(NSDate *)currentDate month:(NSInteger)month {
    NSDateComponents *comps = [[NSDateComponents alloc] init];
    [comps setMonth:month];
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    NSDate *tempDate = [calendar dateByAddingComponents:comps toDate:currentDate options:0];
    return tempDate;
}

六、N'天'前或者后时间

//N天后时间
- (NSDate *) dateByAddingDays: (NSInteger) dDays
{
    NSTimeInterval aTimeInterval = [self timeIntervalSinceReferenceDate] + D_DAY * dDays;
    NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval];
    return newDate;
}
//N'天'前时间
- (NSDate *) dateBySubtractingDays: (NSInteger) dDays
{
    return [self dateByAddingDays: (dDays * -1)];
}

七、N'分钟'前或者后时间

//N分钟后时间
- (NSDate *) dateByAddingMinutes: (NSInteger) dMinutes
{
    NSTimeInterval aTimeInterval = [self timeIntervalSinceReferenceDate] + D_MINUTE * dMinutes;
    NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval];
    return newDate;
}
//N分钟前时间
- (NSDate *) dateBySubtractingMinutes: (NSInteger) dMinutes
{
    return [self dateByAddingMinutes: (dMinutes * -1)];
}

八、N'小时'前或者后时间

//N小时后时间
- (NSDate *) dateByAddingHours: (NSInteger) dHours
{
    NSTimeInterval aTimeInterval = [self timeIntervalSinceReferenceDate] + D_HOUR * dHours;
    NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval];
    return newDate;
}
//N小时前时间
- (NSDate *) dateBySubtractingHours: (NSInteger) dHours
{
    return [self dateByAddingHours: (dHours * -1)];
}

九、昨天

/**
 *  昨天
 *
 *  @return 昨天日期
 */
+ (NSDate *) dateYesterday
{
    return [[NSDate date] dateBySubtractingDays:1];
}

十、明天

/**
 *  明天
 *
 *  @return 明天日期
 */
+ (NSDate *) dateTomorrow
{
    rreturn [[NSDate date] dateByAddingDays:1];
}

十一、是否为今天、是否为明天、是否为昨天

//是否为今天
- (BOOL) isToday
{
    return [self isEqualToDateIgnoringTime:[NSDate date]];
}
//是否为明天
- (BOOL) isTomorrow
{
    return [self isEqualToDateIgnoringTime:[NSDate dateTomorrow]];
}
//是否为昨天
- (BOOL) isYesterday
{
    return [self isEqualToDateIgnoringTime:[NSDate dateYesterday]];
}

- (BOOL) isEqualToDateIgnoringTime: (NSDate *) aDate
{
    NSDateComponents *components1 = [[NSCalendar currentCalendar] components:DATE_COMPONENTS fromDate:self];
    NSDateComponents *components2 = [[NSCalendar currentCalendar] components:DATE_COMPONENTS fromDate:aDate];
    return ((components1.year == components2.year) &&
            (components1.month == components2.month) &&
            (components1.day == components2.day));
}

十二、关于周 是否属于同一周、 是否本周、是否上一周、是否为下周

//是否属于同一周
- (BOOL) isSameWeekWithDate: (NSDate *) date
{
    NSDateComponents *components1 = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:self];
    NSDateComponents *components2 = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate: date];
    
    if (components1.weekOfYear != components2.weekOfYear) return NO;
    
    return (fabs([self timeIntervalSinceDate:aDate]) < D_WEEK);
}
//是否为本周
- (BOOL) isThisWeek
{
    return [self isSameWeekWithDate:[NSDate date]];
}
//是否为下一周
- (BOOL) isNextWeek
{
    NSTimeInterval aTimeInterval = [[NSDate date] timeIntervalSinceReferenceDate] + D_WEEK;
    NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval];
    return [self isSameWeekWithDate:newDate];
}
//是否为上一周
- (BOOL) isLastWeek
{
    NSTimeInterval aTimeInterval = [[NSDate date] timeIntervalSinceReferenceDate] - D_WEEK;
    NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval];
    return [self isSameWeekWithDate:newDate];
}

十三、关于月的 是否同一个月、是否本月

//是否属于同一个月
- (BOOL) isSameMonthWithDate: (NSDate *) date
{
    NSDateComponents *components1 = [CURRENT_CALENDAR components:NSCalendarUnitYear | NSCalendarUnitMonth fromDate:self];
    NSDateComponents *components2 = [CURRENT_CALENDAR components:NSCalendarUnitYear | NSCalendarUnitMonth fromDate: date];
    return ((components1.month == components2.month) &&
            (components1.year == components2.year));
}
//是否为本月
- (BOOL) isThisMonth
{
    return [self isSameMonthWithDate:[NSDate date]];
}

十四、关于年的 是否属于同一年、是否为今年、是否上一年、是否下一年

//是否属于同一年
- (BOOL) isSameYearWithDate: (NSDate *) date
{
    NSDateComponents *components1 = [CURRENT_CALENDAR components:NSCalendarUnitYear fromDate:self];
    NSDateComponents *components2 = [CURRENT_CALENDAR components:NSCalendarUnitYear fromDate: date];
    return (components1.year == components2.year);
}
//是否为今年
- (BOOL) isThisYear
{
    return [self isSameYearWithDate:[NSDate date]];
}
//是否为下一年
- (BOOL) isNextYear
{
    NSDateComponents *components1 = [CURRENT_CALENDAR components:NSCalendarUnitYear fromDate:self];
    NSDateComponents *components2 = [CURRENT_CALENDAR components:NSCalendarUnitYear fromDate:[NSDate date]];
    
    return (components1.year == (components2.year + 1));
}
//是否为前年
- (BOOL) isLastYear
{
    NSDateComponents *components1 = [CURRENT_CALENDAR components:NSCalendarUnitYear fromDate:self];
    NSDateComponents *components2 = [CURRENT_CALENDAR components:NSCalendarUnitYear fromDate:[NSDate date]];
    
    return (components1.year == (components2.year - 1));
}

十五、时间大小比较

//大于当前时间
- (BOOL) isEarlierThanDate: (NSDate *) date
{
    return ([self compare: date] == NSOrderedAscending);
}
//小于当前时间
- (BOOL) isLaterThanDate: (NSDate *) date
{
    return ([self compare: date] == NSOrderedDescending);
}

二、设置时间戳 实现可以在NSString 分类中 或者工具类中

+ (NSString *)getDateWithTargetDate:(NSDate *)targetDate formatter:(NSString *)formatter {
    if (!targetDate) {
        return @"";
    }
    if (!formatter) {
        formatter = @"yyyy-MM-dd HH:mm";
    }
    NSDateFormatter  *dateformatter=[[NSDateFormatter alloc] init];
    dateformatter.dateFormat = formatter;
    NSString *  tempString=[dateformatter stringFromDate:targetDate];
    return tempString;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • iOS应用程序最酷的特性之一就是应用将其自身”绑定”到一个自定义 URL scheme 上,该 scheme 用于...
    HJXu阅读 281评论 0 1
  • 从3月11日开始备战小升初,这里的备战是指带着儿子参加私立中学的入学考试。小升初儿子四年级时就想到择校的问题了,原...
    王沐妍阅读 81评论 0 1
  • 任何时候都要有向上的心 很长一段时间我都做了一些无用的事,每天循环重复,做事情提不起半点精神。 看过一句话“说了很...
    喵鲜阅读 357评论 0 1