NSdate+NSCalendar操作


前言:

由于查询数据库时查询条件需要传递日期来获取某个月份的数据列表,如果传的时该月的某一天会导致拿到数据不全,如果传了该月的第一天会导致拿到的数据并不是当月的;而如果刚好查询当前月份的数据是不能用这个月的最后一天只能用当天来查询,于是有了以下的日历操作


  • 首先,想要直接得到某个日期的NSDate,可以通过dateWithTimeInterval,与某个日期的毫秒差来获取,但是这个方法前提是需要知道基点日期,就算以当前的Date来计算,毫秒的计算也得自己去写清楚;比较麻烦,这时候可以通过日历对象的NSDateComponents来方便地定制指定日期,以下是两个NSDate分类方法
//这个方法可以获取某个与当前NSDate对象指定间隔的日期
//这里传的year.month 等都可以有正负,正数表示该日期之后的,负数表示该日期之前
- (instancetype)getDateFromDateWithYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hours:(NSInteger)hour minute:(NSInteger)minute second:(NSInteger)second{
    //创建一个工具,一个封装了具体年月日、时秒分、周、季度等的类
    //    NSDateComponents* dateComponents = [[NSDateComponents alloc]init];
    NSDateComponents* dateComponents;
    //创建一个日历,它提供了大部分的日期计算接口,并且允许在NSDate和NSDateComponents之间转换
    NSCalendar *dateCalendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
  
    // NSDate 转 NSDateComponents所需要设置的值,可根据需要自己设置,这里是年~秒全部获取,如果某个没有写的话,比如NSCalendarUnitHour,转成NSDateComponents后,会是一个很大或很小的数
    NSInteger unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitWeekday | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
    
    //为dateComponents获取值,该值等价于self的各个部件
    dateComponents = [dateCalendar components:unitFlags fromDate:self];
    //创建一个NSDateComponents,开始设置想要的时间
    NSDateComponents *myCompoentes = [[NSDateComponents alloc]init];
    [myCompoentes setYear:dateComponents.year + year];
    [myCompoentes setMonth:dateComponents.month + month];
    [myCompoentes setDay:dateComponents.day + day];
    [myCompoentes setHour:dateComponents.hour + hour];
    [myCompoentes setMinute:dateComponents.minute + minute];
    [myCompoentes setSecond:dateComponents.second + second];
    
    //把通过myCompoentes设置的值转为NSDate格式,这个NSDate就是想要的时间
    NSDate *myDate = [dateCalendar dateFromComponents:myCompoentes];
    
    return myDate;
}

//这个方法可以直接更改某个日期的某个组件   参数传-1表示不改变
- (instancetype)setDateWithYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hours:(NSInteger)hour minute:(NSInteger)minute second:(NSInteger)second{
    //创建一个工具,一个封装了具体年月日、时秒分、周、季度等的类
    NSDateComponents* dateComponents;
    //创建一个日历,它提供了大部分的日期计算接口,并且允许在NSDate和NSDateComponents之间转换
    NSCalendar *dateCalendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSCalendarIdentifierGregorian];

    NSInteger unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
    
    dateComponents = [dateCalendar components:unitFlags fromDate:self];
    //创建一个NSDateComponents,开始设置想要的时间
    NSDateComponents *myCompoentes = [[NSDateComponents alloc]init];
    
    year != -1 ? [myCompoentes setYear:year] : [myCompoentes setYear:dateComponents.year];
    month != -1 ? [myCompoentes setMonth:month] : [myCompoentes setMonth:dateComponents.month];
    day != -1 ? [myCompoentes setDay:day] : [myCompoentes setDay:dateComponents.day];
    hour != -1 ? [myCompoentes setHour:hour] : [myCompoentes setHour:dateComponents.hour];
    minute != -1 ? [myCompoentes setMinute: minute : [myCompoentes setMinute:dateComponents.minute];
    second != -1 ? [myCompoentes setSecond:second] : [myCompoentes setSecond:dateComponents.second];
    //把通过myCompoentes设置的值转为NSDate格式,这个NSDate就是想要的时间
    NSDate *myDate = [dateCalendar dateFromComponents:myCompoentes];
    
    return myDate;
}

  • 接下来要分析如何得到某个月份的最后一天,由于每个月的天数的不一样,还有2月这个特殊存在,不好使用穷尽判断的方式来设置.这时候就想到日历对象对日期的操作,结合上面两个方法,轻而易举的就实现了
- (NSDate *)getMonthLastDate{
  //先设置为1号,因为比如10月份如果是刚好是31号然后让它月份+1,会导致得到的日期变成12月的1号而不是11月30号
    NSDate *firstDate = [self setDateWithYear:-1 month:-1 day:1 hours:0 minute:0 second:0];
    //再让月份+1  ,这样就得到了下个月的1号
    NSDate *nextMonthDate = [firstDate getDateFromDateWithYear:0 month:1 day:0 hours:0 minute:0 second:0];
    //最后让已经是1号的NSDate天数-1,  就得到了本月的最后一天了
    NSDate *monthLastDate = [nextMonthDate getDateFromDateWithYear:0 month:0 day:-1 hours:0 minute:0 second:0];
    return monthLastDate;
}

  • 这里有个小插曲,就是如果需要拿当前月份的数据的时候,不能传这个月的最后一天,只能传当前Date,因此需要判断NSDate是否是当月
- (BOOL)isThisMonth
{
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth;
    // 获得某个时间的年月
    NSDateComponents *dateCmps = [calendar components:unit fromDate:self];
  //与当前日期比较
    NSDateComponents *nowCmps = [calendar components:unit fromDate:[NSDate date]];
    return dateCmps.year == nowCmps.year && dateCmps.month == nowCmps.month;
}

  • 如果需要判断得到的日期是否是周末
- (BOOL)isWeekend{
    //计算week数
    NSCalendar * myCalendar = [NSCalendar currentCalendar];
    myCalendar.timeZone = [NSTimeZone systemTimeZone];
    NSInteger week = [[myCalendar components:NSCalendarUnitWeekday fromDate:self] weekday];
    //国际日期中1是周日 7是周六 , 其他2~6对应星期一~星期五
    switch (week) {
        case 1: { return YES; }
        case 7: { return YES; }
        default: { return NO; }
    }
}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,937评论 6 13
  • SwiftDate概况 从Swift发布起,我们就没有放弃使用Swift。 当然,我们希望在项目能够轻松自如地管理...
    Mee_Leo阅读 10,047评论 1 13
  • 九月金秋,幸福携手,众仙群聚力览石首团山。9月22号笨小主伪装成文化人紧跟着《楚望诗社》的团队,以郭社长为核心,早...
    紫翼惠瑄阅读 362评论 0 3
  • 就是,看着电视,很困了,然后,你去看他一眼,他就会迷糊的说,把电视关了,然后,就关了,一秒钟后,听到他熟睡的声音,...
    火耳33阅读 617评论 0 0