美文网首页
iOS之根据日期计算星期几

iOS之根据日期计算星期几

作者: 轮子糙 | 来源:发表于2018-06-04 23:23 被阅读553次

    在自己的项目中有这个需求,在网上找了下,没有找到理想的结果,就整合下使用自己的想法实现了这个功能。

    实现思路

    大概的实现方式和大家分享下,有不对的地方欢迎大家留言指教,相互学习.

    方案一

    传入例如"2018-05-09"或者"2016/05/09"格式的字符串即可返回日期是周几

    
    - (NSString*)weekDayStr:(NSString*)format{
        
        NSString *weekDayStr = nil;
        NSDateComponents *comps = [[NSDateComponents alloc] init];
        if(format.length>=10) {
            NSString *nowString = [format substringToIndex:10];
            NSArray *array = [nowString componentsSeparatedByString:@"-"];
            if(array.count==0) {
                array = [nowString componentsSeparatedByString:@"/"];
            }
            
            if(array.count>=3) {
                NSInteger year = [[array objectAtIndex:0] integerValue];
                NSInteger month = [[array objectAtIndex:1] integerValue];
                NSInteger day = [[array objectAtIndex:2] integerValue];
                [comps setYear:year];
                [comps setMonth:month];
                [comps setDay:day];
            }
        }
        //日历
        NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
        //获取传入date
        NSDate *_date = [gregorian dateFromComponents:comps];
        
        NSDateComponents *weekdayComponents = [gregorian components:NSCalendarUnitWeekday fromDate:_date];
        NSInteger week = [weekdayComponents weekday];
        switch(week) {
            case 1:
                weekDayStr =@"星期日";
                break;
            case 2:
                weekDayStr =@"星期一";
                break;
            case 3:
                weekDayStr =@"星期二";
                break;
            case 4:
                weekDayStr =@"星期三";
                break;
            case 5:
                weekDayStr =@"星期四";
                break;
            case 6:
                weekDayStr =@"星期五";
                break;
            case 7:
                weekDayStr =@"星期六";
                break;
            default:
                weekDayStr =@"";
                break;
        }
        return weekDayStr;
    }
    

    方案二

    1.首先计算未来的某个日期 和 当前日期相差天数
    2.在获取当前是星期几(返回结果如下格式)
     1--星期天
     2--星期一
     3--星期二
     4--星期三
     5--星期四
     6--星期五
     7--星期六
    3.最后在当前星期 基础上 加上 相差天数,就获取未来那个日期所对应的星期(此处可以将 (相差天数 % 7),结果就更加明了相差的天数(结果是0,说明未来的某个日期的星期就是对应当前的星期),7代表的一周共7天

    获取未来某一日期是星期几
    /**
    *  获取未来某个日期是星期几
    *  注意:featureDate 传递过来的格式 必须 和 formatter.dateFormat 一致,否则endDate可能为nil
    *
    */
    - (NSString *)featureWeekdayWithDate:(NSString *)featureDate{
     // 创建格式对象
     NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
     // 设置日期格式可以根据自己的需求随时调整,否则计算的结果可能为 nil
     formatter.dateFormat = @"yyyy-MM-dd";
     // 将字符串日期 转换为 NSDate 类型
     NSDate *endDate = [formatter dateFromString:featureDate];
     //判断当前日期和未来某个时刻日期相差的天数
     long days = [self daysFromDate:[NSDate date] toDate:endDate];
     //将总天数换算为以周计算(假如相差10天,其实就是等于相差1周零3天,只需要取3天,更加方便计算)
     long day = days >= 7 ? days % 7 : days;
     long week = [self getNowWeekday] + day;
     switch (week) {
      case 1:
       return @"星期天";
       break;
      case 2:
       return @"星期一";
       break;
      case 3:
       return @"星期二";
       break;
      case 4:
       return @"星期三";
       break;
      case 5:
       return @"星期四";
       break;
      case 6:
       return @"星期五";
       break;
      case 7:
       return @"星期六";
       break;
      default:
       break;
     }
     return nil;
    }
    
    /**
    *  计算2个日期相差天数
    *  startDate  起始日期
    *  endDate    截至日期
    */
    
    -(NSInteger)daysFromDate:(NSDate *)startDate toDate:(NSDate *)endDate {
     NSDateFormatter *dateFormatter=[[NSDateFormatter alloc] init];
     // 话说在真机上需要设置时区,才能正确获取本地日期,天朝代码:zh_CN
     dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];
     [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
     //得到相差秒数
     NSTimeInterval time = [endDate timeIntervalSinceDate:startDate];
     int days = ((int)time)/(3600*24);
     int hours = ((int)time)%(3600*24)/3600;
     int minute = ((int)time)%(3600*24)/3600/60;
     if (days <= 0 && hours <= 0&&minute<= 0) {
      NSLog(@"0天0小时0分钟");
      return 0;
      }else {
       NSLog(@"%@",[[NSString alloc] initWithFormat:@"%i天%i小时%i分钟",days,hours,minute]);
     // 之所以要 + 1,是因为 此处的days 计算的结果 不包含当天 和 最后一天(如星期一 和 星期四,计算机算的结果就是2天(星期二和星期三),日常算,星期一与星期四相差3天,所以需要+1)对于时分 没有进行计算 可以忽略不计
        return days + 1;
     }
    }
    

    相关文章

      网友评论

          本文标题:iOS之根据日期计算星期几

          本文链接:https://www.haomeiwen.com/subject/azeusftx.html