服務器時間處理

時間字符串與date轉化, 利用NSDateFormatter

常用格式例如: @"2016-01-29 22:20:02" 轉date
- (void)str2Date
{
    NSString *strDate = @"2016-01-29 22:20:02";
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    
    NSDate *date = [fmt dateFromString:strDate];
    NSLog(@"%@", date);
}
  • log結果:2016-01-29 14:20:02 +0000

date轉字符串:

- (void)date2Str
{
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyy/MM/dd : HH:mm:ss";
    NSString *strDate = [fmt stringFromDate:[NSDate date]];
    NSLog(@"%@", strDate);
}
  • log結果:2016/01/30 : 22:17:19
  • 常用日期格式符:
    • yyyy:year
    • MM:month
    • dd:day
    • HH:24小時制, hh12小時制
    • mm:minute
    • ss:second
  • 字符串轉date, 只要將對應的數(shù)值替代為對應的格式符就行了
  • date轉字符串:系統(tǒng)只會將對應格式符的數(shù)值替代格式符的位置, 你自定義用來連接日期的的其他符號沒有任何影響,所以你也可以這樣寫: @"MM/dd yyyy : HH:mm:ss”, 或者只寫其中某一部分都行:@“HH:mm”

你可能還會遇到這樣的格式:@"Tue Sep 28 17:46:55 +0800 2011"

- (void)str2Date_locale
{
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.locale = [NSLocale localeWithLocaleIdentifier:@"en_US"];
    fmt.dateFormat = @"EEE MMM dd HH:mm:ss Z yyyy";
    NSDate *date = [fmt dateFromString:@"Tue Sep 28 17:46:55 +0800 2011"]; // 國際通用時間的格式
    NSLog(@"%@", date);
}
  • log:2011-09-28 09:46:55 +0000
  • 這幾個格式你還需要知道:
    • MMM:表示其中的Sep, 后面MM表示month, 跟前面一樣, 前面一個M表示這種格式的月份
      • 拓展:M:9, MM:09, MMM:Sep, MMMM:September
    • EEE:代表week, Tuesday
      • 拓展:EEE:Tue, EEEE:Tuesday, EEEEE:T
    • Z, 代表時區(qū), + 是東時區(qū), - 是西時區(qū)
  • 這種國際比較通用的時間格式, 一般最好統(tǒng)一時間格式的locale
    將本地化修改為en_US

時間戳, @"1231234343433”, 這種時間格式的含義是距離1970年, 經(jīng)過了多長時間

- (void)string2DataUseShijianchuo
{
    NSString *strDate = @"1231234343433";// 時間戳, 單位毫秒, 表示從1970年開始經(jīng)過了多少時間
    NSDate *date = [NSDate dateWithTimeIntervalSince1970:strDate.doubleValue / 1000];
    NSLog(@"%@", date);
}
  • log:2009-01-06 09:32:23 +0000

NSDate比較

  • 對時間比較以及求時間差等, 一般將時間轉為NSDate, 在處理時更方便

粗略的比較用compare這個方法

  • 巧記
    • Descending, 從左到右降序, 消極的
    • Ascending, 從左到右升序, 積極的
- (void)compare
{
    NSString *createdAtString = @"2016-01-29 10:18:01";
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    NSDate *createDate = [fmt dateFromString:createdAtString];
    NSDate *curDate = [NSDate date];
    NSComparisonResult res = [createDate compare:curDate];
    if (res == NSOrderedDescending) {
        NSLog(@"降序");// 左邊大于右邊
    }else if (res == NSOrderedAscending){
        NSLog(@"升序");// 左邊小于右邊
    }else if (res == NSOrderedSame){
        NSLog(@"相等");// 相等
    }
    NSLog(@"%zd, %@, %@", res, createDate, curDate);
}
  • log: 升序

date的比較和服務器返回字符串時間自定義格式化顯示

計算兩個date的時間差

- (void)delta
{
    // 日期格式化對象
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    // 設置日期格式
    fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    
    // 2個日期對象
    NSDate *date1 = [fmt dateFromString:@"2016-01-29 10:18:01"];
    NSDate *date2 = [fmt dateFromString:@"2016-02-02 11:22:45"];
    
    NSInteger timeInterval = [date2 timeIntervalSinceDate:date1];
    
    // 將時間差轉化為對應的時分秒...
    // 1分鐘 = 60秒
    NSInteger secondsPerMinute = 60;
    
    // 1小時 = 60 * 60秒 = 3600秒
    NSInteger secondsPerHour = 60 * secondsPerMinute;
    
    // 1天 = 24 * 60  * 60秒
    NSInteger secondsPerDay = 24 * secondsPerHour;
    
    NSInteger day = timeInterval / secondsPerDay;
    NSInteger hour = (timeInterval % secondsPerDay) / secondsPerHour;
    NSInteger minute = ((timeInterval % secondsPerDay) % secondsPerHour) / secondsPerMinute;
    NSInteger second = timeInterval % secondsPerMinute;
    
    NSLog(@"%zd天%zd小時%zd分%zd秒", day, hour, minute, second);
}
  • log: 4天1小時4分44秒
  • 可以將上面的方法抽成NSdate的分類,因為返回值有很多, 所以我們考略用集合類型作為方法返回值, 不過這樣也比較麻煩
    • 還可以考慮用結構體作為返回值, 比集合類型號, 但結構體只能是基本數(shù)據(jù)類型, 通用性不高, 最后我們考慮用模型來保存返回值, 給模型定義多個屬性, 這樣通用性更高, 也更靈活

將上面的功能抽分類:

  • 開發(fā)中我們將常需要對日期進行比較, 所以我們再提供幾個方法:

.h文件

@interface JJTimeInterval : NSObject
/** 天 */
@property (nonatomic, assign) NSInteger day;
/** 小時 */
@property (nonatomic, assign) NSInteger hour;
/** 分鐘 */
@property (nonatomic, assign) NSInteger minute;
/** 秒 */
@property (nonatomic, assign) NSInteger second;

@end

@interface NSDate (JJTimeInterval)

- (JJTimeInterval *)jj_timeIntervalSince:(NSDate *)date;

/**
 * 是否為今天
 */
- (BOOL)jj_isInToday;

/**
 * 是否為昨天
 */
- (BOOL)jj_isInYesterday;

/**
 * 是否為明天
 */
- (BOOL)jj_isInTomorrow;

/**
 * 是否為今年
 */
- (BOOL)jj_isInThisYear;
@end
  • 實現(xiàn)jj_timeIntervalSince:方法
  • 注意:
    • NSCalendar currentCalendar是以前的方法, 有時會有一些bug, 最好用下面這個方法, 但這個方法是iOS_8才有的, 所以要適配
+ (instancetype)jj_calendar
{
    if ([self respondsToSelector:@selector(calendarWithIdentifier:)]) {
        return [self calendarWithIdentifier:NSCalendarIdentifierGregorian];
    }
    return [self currentCalendar];
}

  • 不能僅僅判斷cmp.year == 0 && cmp.month == 0 && cmp.day == 0, 該方法會結合時分秒,如果時間差在24小時內, 就算差一天, 而我們的需求是, 只要日期day的數(shù)字差一天就算差一天, 相同則為同一天, 所以要剔除時分秒的影響

.m文件

@implementation JJTimeInterval

@end

@implementation NSDate (JJTimeInterval)

- (JJTimeInterval *)jj_timeIntervalSince:(NSDate *)date
{
    JJTimeInterval *timeInterval = [[JJTimeInterval alloc] init];
    
    NSInteger interval = [self timeIntervalSinceDate:date];
    
    // 將時間差轉化為對應的時分秒...
    // 1分鐘 = 60秒
    NSInteger secondsPerMinute = 60;
    
    // 1小時 = 60 * 60秒 = 3600秒
    NSInteger secondsPerHour = 60 * secondsPerMinute;
    
    // 1天 = 24 * 60  * 60秒
    NSInteger secondsPerDay = 24 * secondsPerHour;
    
    timeInterval.day = interval / secondsPerDay;
    timeInterval.hour = (interval % secondsPerDay) / secondsPerHour;
    timeInterval.minute = ((interval % secondsPerDay) % secondsPerHour) / secondsPerMinute;
    timeInterval.second = interval % secondsPerMinute;

    return timeInterval;
}

- (BOOL)jj_isInToday
{
    // 不呢僅僅判斷cmp.year == 0 && cmp.month == 0 && cmp.day == 0, 該方法會結合時分秒,如果時間差在24小時內, 就算差一天, 而我們的需求是, 只要日期day差一天就算差一天, 相同則為同一天, 所以要提出時分秒的影響
    NSCalendar *calendar = [NSCalendar jj_calendar];
    NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
    NSDateComponents *selfCmp = [calendar components:unit fromDate:self];
    NSDateComponents *nowCmp = [calendar components:unit fromDate:[NSDate date]];
    if ([selfCmp isEqual:nowCmp]) {
        return YES;
    }
    return NO;
}

- (BOOL)jj_isInTomorrow
{
    NSCalendar *calendar = [NSCalendar jj_calendar];
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyyMMdd";
    NSString *selfStr = [fmt stringFromDate:self];
    NSString *nowStr = [fmt stringFromDate:[NSDate date]];
    // 獲得只有年月日的格式化date
    NSDate *selfDate = [fmt dateFromString:selfStr];
    NSDate *nowDate = [fmt dateFromString:nowStr];
    NSDateComponents *cmp = [calendar components:NSCalendarUnitDay fromDate:selfDate toDate:nowDate options:0];
    if (cmp.day == 1) {
        return YES;
    }
    return NO;
}

- (BOOL)jj_isInYesterday
{
    // 注意deltaDay == -1, deltaMonth == 0,deltaYear == 0, | 注意deltaDay == 1, deltaMonth == 0,deltaYear == 0, 并不能表示,一定是昨天或明天
    NSCalendar *calendar = [NSCalendar jj_calendar];
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyyMMdd";
    NSString *selfStr = [fmt stringFromDate:self];
    NSString *nowStr = [fmt stringFromDate:[NSDate date]];
    // 獲得只有年月日的格式化date
    NSDate *selfDate = [fmt dateFromString:selfStr];
    NSDate *nowDate = [fmt dateFromString:nowStr];
    NSDateComponents *cmp = [calendar components:NSCalendarUnitDay fromDate:selfDate toDate:nowDate options:0];
    if (cmp.day == -1) {
        return YES;
    }
    return NO;
}

- (BOOL)jj_isInThisYear
{
    NSCalendar *calendar = [NSCalendar jj_calendar];
    NSCalendarUnit unit = NSCalendarUnitYear;
    NSDateComponents *selfCmp = [calendar components:unit fromDate:self];
    NSDateComponents *nowCmp = [calendar components:unit fromDate:[NSDate date]];
    if ([selfCmp isEqual:nowCmp]) {
        return YES;
    }
    return NO;
}
@end

應用

  • created____at是模型時間, 用我們的分類, 得到我們想要的時間
  • 判斷邏輯:優(yōu)先判斷今天昨天,然后再是今年去年
- (NSString *)formatCreated_at:(JJTopic *)topic
{
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    NSDate *create_atDate = [fmt dateFromString:topic.created_at];
    
    JJTimeInterval *timeInterval = [create_atDate jj_timeIntervalSince];
    if ([create_atDate jj_isInToday]) {
        
        if (timeInterval.hour !=0) {
            return [NSString stringWithFormat:@"%ld小時前", timeInterval.hour];
        }else if (timeInterval.minute != 0){
            return [NSString stringWithFormat:@"%ld分鐘前", timeInterval.minute];
        }else{
            return [NSString stringWithFormat:@"剛剛"];
        }
        
    }else if([create_atDate jj_isInYesterday]){
        
        fmt.dateFormat =@"HH:mm:ss";
        
        return [NSString stringWithFormat:@"昨天:%@", [fmt stringFromDate:create_atDate]];
        
    }else if ([create_atDate jj_isInThisYear]){
        
        fmt.dateFormat = @"MM-dd HH:mm:ss";
        return [NSString stringWithFormat:@"%@", [fmt stringFromDate:create_atDate]];
        
    }else{
        
        return topic.created_at;
    }
    return nil;
}

屏幕快照 2016-01-31 下午10.29.51.png

寫的不好,下篇寫上下拉刷新的實現(xiàn), 不過過年也許就不寫了...

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市私蕾,隨后出現(xiàn)的幾起案子僵缺,更是在濱河造成了極大的恐慌,老刑警劉巖踩叭,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件磕潮,死亡現(xiàn)場離奇詭異,居然都是意外死亡容贝,警方通過查閱死者的電腦和手機自脯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斤富,“玉大人膏潮,你說我怎么就攤上這事÷Γ” “怎么了焕参?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵轻纪,是天一觀的道長。 經(jīng)常有香客問我叠纷,道長刻帚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任涩嚣,我火速辦了婚禮崇众,結果婚禮上,老公的妹妹穿的比我還像新娘航厚。我一直安慰自己顷歌,他們只是感情好,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布幔睬。 她就那樣靜靜地躺著眯漩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪溪窒。 梳的紋絲不亂的頭發(fā)上坤塞,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機與錄音澈蚌,去河邊找鬼。 笑死灼狰,一個胖子當著我的面吹牛宛瞄,可吹牛的內容都是我干的。 我是一名探鬼主播交胚,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼份汗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蝴簇?” 一聲冷哼從身側響起杯活,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎熬词,沒想到半個月后旁钧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡互拾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年歪今,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颜矿。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡寄猩,死狀恐怖,靈堂內的尸體忽然破棺而出骑疆,到底是詐尸還是另有隱情田篇,我是刑警寧澤替废,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站泊柬,受9級特大地震影響舶担,放射性物質發(fā)生泄漏。R本人自食惡果不足惜彬呻,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一衣陶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闸氮,春花似錦剪况、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至或悲,卻和暖如春孙咪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背巡语。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工翎蹈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人男公。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓荤堪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親枢赔。 傳聞我的和親對象是個殘疾皇子澄阳,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內容