ios开发-如何处理服务器返回的日期

作者: 没阳光的午后 | 来源:发表于2015-12-28 13:30 被阅读3341次

本篇所讲的是如何对服务器返回的时间数据处理成自己想显示的时间格式并且完成判断今天昨天今年

基本概念

  • 需要先创建一个NSDateFormatter来设置一下日期格式dateFormat
  • y代表年,M代表月,d代表天,h/H代表小时,这里h代表12小时制,H代表24小时制,m代表分,s代表秒,Z代表时区,注意:这里需要严格区分大小写,否则会导致错误

几种转换服务器返回的日期数据例子

1.返回的数据为 Tue May 31 18:20:45 +0800 2011

    NSString *string = @"Tue May 31 18:20:45 +0800 2011";

    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];

    fmt.dateFormat = @"EEE MMM dd HH:mm:ss ZZZZ yyyy";

    fmt.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en-US"];

    NSDate *date = [fmt dateFromString:string];

2.返回的数据为 12/23/2015 12点08:03秒

    NSString *string = @"12/23/2015 12点08:03秒";

    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"MM/dd/yyyy HH点mm:ss秒";

    NSDate *date = [fmt dateFromString:string];

3.返回的数据为 2015-12-26 12:08:03

    NSString *createdAt = @"2015-12-26 12:08:03";

    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";

4.还有种特殊情况,也许服务器会返回一长串数字,譬如525245245,这个不是服务器出错了,这长串数字叫时间戳,这时候需要将时间戳转换为1970年的时间,并且除以1000

    NSString *string = @"1454645645654";

    NSDate *date = [NSDate dateWithTimeIntervalSince1970:string.doubleValue / 1000];

如何通过手机本地时间判断服务器返回时间是哪天

1.如何判断今年很简单,只需要将本地时间和返回数据转为yyyy格式就可以判断

    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyy";
    
    NSString *nowYear = [fmt stringFromDate:[NSDate date]];
    NSString *selfYear = [fmt stringFromDate:self];
    
    return [nowYear isEqualToString:selfYear];

2.如何判断昨天,将格式转为yyyyMMdd,然后将时间字符串转为NSDate类型来比较

    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyyMMdd";
    
    NSString *nowString = [fmt stringFromDate:[NSDate date]]; 
    NSString *selfString = [fmt stringFromDate:self]; 
    
    NSDate *nowDate = [fmt dateFromString:nowString];
    NSDate *selfDate = [fmt dateFromString:selfString];
    
    NSCalendar *calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
    NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
    NSDateComponents *cmps = [calendar components:unit fromDate:selfDate toDate:nowDate options:0];
    
    return cmps.year == 0
    && cmps.month == 0
    && cmps.day == 1;

3.判断今天和判断昨天差不多

    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyyMMdd";
    
    NSString *nowString = [fmt stringFromDate:[NSDate date]]; 
    NSString *selfString = [fmt stringFromDate:self];
    
    return [nowString isEqualToString:selfString];

最后在模型里面设置时间

    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    NSDate *createdAtDate = [fmt dateFromString:_created_at];
    
    if (createdAtDate.bs_isThisYear) { // 今年
        if (createdAtDate.bs_isYesterday) { // 昨天
            fmt.dateFormat = @"昨天 HH:mm:ss";
            return [fmt stringFromDate:createdAtDate];
        } else if (createdAtDate.bs_isToday) { // 今天
            NSCalendar *calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
            NSCalendarUnit unit = NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
            NSDateComponents *cmps = [calendar components:unit fromDate:createdAtDate toDate:[NSDate date] options:0];
            
            if (cmps.hour >= 1) { // 时间间隔 >= 1小时
                return [NSString stringWithFormat:@"%zd小时前", cmps.hour];
            } else if (cmps.minute >= 1) { // 1小时 > 时间间隔 >= 1分钟
                return [NSString stringWithFormat:@"%zd分钟前", cmps.minute];
            } else { // 时间间隔 < 1分钟
                return @"刚刚";
            }
        } else { // 不是今天昨天
            fmt.dateFormat = @"MM-dd HH:mm:ss";
            return [fmt stringFromDate:createdAtDate];
        }
    } else { // 不是今年
        return _created_at;
    }

相关文章

网友评论

  • 9fcd33829c9b:除以一千么 NSDate转的那个
  • 蒂埃里:大神你好,我后台返回是是时间字符串2015-12-26 12:08:03,我只想要显示2015-12-26,按你的方法,为什么转出来是null
  • 东南涯:小白提问:createdAtDate.bs_isThisYear 属性bs_isThisYear是自己创建添加的还是需要添加库?
  • 856f318e4216:,譬如525245245,------这个是不用除以 1000的,直接 : NSDate *now = [NSDate dateWithTimeIntervalSince1970:d];这样,我的服务器是这样的
  • 消逝彼得:你好,我在model里用的NSDate类型接收,然后在JSONValueTransformer里转的,返回值也没问题,但是model数组里所有的NSDate类型都是nil了,大神有解么
    没阳光的午后:@消逝彼得 http://bigpi.me/post/jsonmodel/jsonmodel-shi-yong-shi-li
    消逝彼得:@没阳光的午后 恩,用字符串没任何问题,但是技术总监说要从model层拒绝一切可能的不兼容,强制用NSdate....
    没阳光的午后:用字符串接收 然后自己转日期
  • 翀鹰精灵:我想问下,服务器返回给我的这个数据launchTime = 1463990207000是不是时间戳,我用你的第四种方式转换,怎么出来是这种1970-01-01 00:00:00 +0000,这是转换错误了吧
    翀鹰精灵:@没阳光的午后 你给的这个转换的结果是对的,但是为什么我转换出来不对? :sweat:
    翀鹰精灵:@没阳光的午后 求大神指点,你是用第几个方法方法,你看我写的哪里有问题吗
    NSString *time =[dic objectForKey:@"launchTime"];
    NSDate *timeDate = [NSDate dateWithTimeIntervalSince1970:time.doubleValue / 1000];
    NSLog(@"timedate:%@",timeDate);
    为什么输出还是 00:00:00 +0000
    QQ:787213643 求指点
    没阳光的午后:@翀鹰女孩 是时间戳,转出来应该是2016/5/23 15:56:47
  • 胖子程:很赞!
  • husky_duang:有demo?
  • 彬哲:这种堆砌知识点的文章也能被收入我也是醉了。
    fd5b2cda3729:@mingjiameng 渣渣就默默看着大神们争吵:flushed:
    彬哲:@没阳光的午后 Sorry,我的评论有点偏激了,每个都有自己的需求。
    没阳光的午后:@ZkeyDream 大神看过就好了 我也是看到群里好几个人问这个时间问题才写出来的 没必要醉不醉的 总有人不知道
  • 子达如何:这个方法貌似有很大的性能问题
    酱油葱:@子达如何 oc 有更好的比较方式么?
    子达如何:nsformatter整个运行效率兜比较差
    没阳光的午后:@子达如何 你指的是比较时间那块么

本文标题:ios开发-如何处理服务器返回的日期

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