iOS時間格式化輸出技巧

時間格式化輸出

一.前言

最近項目開發(fā)過程中用到了大量的關(guān)于時間的處理,將后臺返回的時間字符串轉(zhuǎn)換為指定的格式時間再顯示在UI上.

例如: 將后臺返回的時間字符串2017-04-16 13:08:06轉(zhuǎn)換為:2017年04月16日滥壕、2017年04月傻唾、04月16日衬浑、2017-04-16戏羽、2017-0404-1613:08昭躺、星期幾等等.

項目是多人開發(fā),由于前期沒有統(tǒng)一處理時間轉(zhuǎn)換的問題,后期發(fā)現(xiàn)項目中好多關(guān)于時間轉(zhuǎn)換的代碼,大部分都是通過(- : 等字符)截取成字符串?dāng)?shù)組再取相應(yīng)時間拼接成指定格式,輸出在UI顯示的地方,代碼非常的臃腫,并且這種方式非常不可取.

原因:后臺返回的時間字符串 并不都是 2017-04-16 13:08:06這種格式,還有2017-04-16這種格式,截取前需要長度格式等校驗,多了很多校驗代碼.非常不可取.

既然是時間,我們便要通過時間的思維來完成轉(zhuǎn)換問題,不要通過截取字符串的方式

于是我便寫了一個類,來統(tǒng)一處理轉(zhuǎn)換問題.

代碼地址:見片尾

二.效果

Demo.png

具體怎么操作:

三.將時間字符串->NSDate

首先我們要將2017-04-16 13:08:062017-04-16這種格式時間字符串轉(zhuǎn)換為NSDate

我們新建一個NSDate的Category,筆者取名為NSDate+XHCategory,寫一個時間字符串->NSDate方法,代碼如下:

+(NSDate*)xh_dateWithFormat_yyyy_MM_dd_HH_mm_ss_string:(NSString *)string
{
    NSDateFormatter* dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSDate *date =[dateFormat dateFromString:string];
    return date;
}

為了兼用其他格式時間字符串,我們把可能的情況都寫上,如下

+(NSDate *)xh_dateWithFormat_yyyy_MM_dd_HH_mm_string:(NSString *)string
{
    NSDateFormatter* dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm"];
    NSDate *date =[dateFormat dateFromString:string];
    return date;
}

+(NSDate *)xh_dateWithFormat_yyyy_MM_dd_HH_string:(NSString *)string
{
    NSDateFormatter* dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyy-MM-dd HH"];
    NSDate *date =[dateFormat dateFromString:string];
    return date;
}

+(NSDate *)xh_dateWithFormat_yyyy_MM_dd_string:(NSString *)string
{
    NSDateFormatter* dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyy-MM-dd"];
    NSDate *date =[dateFormat dateFromString:string];
    return date;
}

+(NSDate *)xh_dateWithFormat_yyyy_MM_string:(NSString *)string
{
    NSDateFormatter* dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyy-MM"];
    NSDate *date =[dateFormat dateFromString:string];
    return date;
}

再寫一個統(tǒng)一轉(zhuǎn)換時間字符串為 NSDate的方法,如下:

+(NSDate *)xh_dateWithDateString:(NSString *)dateString
{
    NSDate *date = nil;
    date = [self xh_dateWithFormat_yyyy_MM_dd_HH_mm_ss_string:dateString];
    if(date) return date;
    date = [self xh_dateWithFormat_yyyy_MM_dd_HH_mm_string:dateString];
    if(date) return date;
    date = [self xh_dateWithFormat_yyyy_MM_dd_HH_string:dateString];
    if(date) return date;
    date = [self xh_dateWithFormat_yyyy_MM_dd_string:dateString];
    if(date) return date;
    date = [self xh_dateWithFormat_yyyy_MM_string:dateString];
    if(date) return date;
    return nil;
}

四.將NSDate -> NSDateFormatter

為什么要再轉(zhuǎn)換為NSDateFormatter,有些人可能已經(jīng)明白了,我們點開NSDateFormatter可以看到NSDateFormatter有以下屬性

@property (nullable, copy) NSCalendar *calendar NS_AVAILABLE(10_7, 4_0);
@property (nullable, copy) NSTimeZone *timeZone NS_AVAILABLE(10_7, 4_0);
@property NSInteger era;
@property NSInteger year;
@property NSInteger month;
@property NSInteger day;
@property NSInteger hour;
@property NSInteger minute;
@property NSInteger second;
@property NSInteger nanosecond NS_AVAILABLE(10_7, 5_0);
@property NSInteger weekday;
@property NSInteger weekdayOrdinal;
@property NSInteger quarter NS_AVAILABLE(10_6, 4_0);
@property NSInteger weekOfMonth NS_AVAILABLE(10_7, 5_0);
@property NSInteger weekOfYear NS_AVAILABLE(10_7, 5_0);
@property NSInteger yearForWeekOfYear NS_AVAILABLE(10_7, 5_0);
@property (getter=isLeapMonth) BOOL leapMonth NS_AVAILABLE(10_8, 6_0);
@property (nullable, readonly, copy) NSDate *date NS_AVAILABLE(10_7, 4_0);

@end

我們新建一個NSDateComponents 的Category,筆者取名NSDateComponents+XHCategory,并實現(xiàn)如下方法:

+(NSDateComponents *)xh_dateComponentsFromDate:(NSDate *)date
{
    NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitYear| NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekOfYear |  NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitWeekday | NSCalendarUnitWeekdayOrdinal fromDate:date];
    return components;
    
}

接著我們就可以進行轉(zhuǎn)換操作了,我們新建一個NSString的Category,筆者取名NSString+XHDateFormat

在NSString+XHDateFormat.h文件中寫上需要轉(zhuǎn)換的類型如下:


/**
 *  x年x月x日
 */
@property(nonatomic,copy,readonly)NSString *xh_formatNianYueRi;

/**
 *  x年x月
 */
@property(nonatomic,copy,readonly)NSString *xh_formatNianYue;

/**
 *  x月x日
 */
@property(nonatomic,copy,readonly)NSString *xh_formatYueRi;

/**
 *  x年
 */
@property(nonatomic,copy,readonly)NSString *xh_formatNian;

/**
 *  x時x分x秒
 */
@property(nonatomic,copy,readonly)NSString *xh_formatShiFenMiao;

/**
 *  x時x分
 */
@property(nonatomic,copy,readonly)NSString *xh_formatShiFen;

/**
 *  x分x秒
 */
@property(nonatomic,copy,readonly)NSString *xh_formatFenMiao;

/**
 *  yyyy-MM-dd
 */
@property(nonatomic,copy,readonly)NSString *xh_format_yyyy_MM_dd;

/**
 *  yyyy-MM
 */
@property(nonatomic,copy,readonly)NSString *xh_format_yyyy_MM;

/**
 *  MM-dd
 */
@property(nonatomic,copy,readonly)NSString *xh_format_MM_dd;

/**
 *  yyyy
 */
@property(nonatomic,copy,readonly)NSString *xh_format_yyyy;

/**
 *  HH:mm:ss
 */
@property(nonatomic,copy,readonly)NSString *xh_format_HH_mm_ss;

/**
 *  HH:mm
 */
@property(nonatomic,copy,readonly)NSString *xh_format_HH_mm;

/**
 *  mm:ss
 */
@property(nonatomic,copy,readonly)NSString *xh_format_mm_ss;

#pragma mark - 轉(zhuǎn)換為星期幾
@property(nonatomic,copy,readonly)NSString *xh_formatWeekDay;

在 NSString+XHDateFormat.m 實現(xiàn)如下:

-(NSString *)xh_formatNianYueRi
{
    NSDate *date = [NSDate xh_dateWithDateString:self];
    return [NSString stringWithFormat:@"%ld年%02ld月%02ld日",date.year,date.month,date.day];
}
-(NSString *)xh_formatNianYue
{
    NSDate *date = [NSDate xh_dateWithDateString:self];
    return [NSString stringWithFormat:@"%ld年%02ld月",date.year,date.month];
}
-(NSString *)xh_formatYueRi
{
    NSDate *date = [NSDate xh_dateWithDateString:self];
    return [NSString stringWithFormat:@"%02ld月%02ld月",date.month,date.day];
}
-(NSString *)xh_formatNian
{
    NSDate *date = [NSDate xh_dateWithDateString:self];
    return [NSString stringWithFormat:@"%ld年",date.year];
}
-(NSString *)xh_formatShiFenMiao
{
    NSDate *date = [NSDate xh_dateWithDateString:self];
    return [NSString stringWithFormat:@"%ld時%02ld分%02ld秒",date.hour,date.minute,date.seconds];
}
-(NSString *)xh_formatShiFen
{
    NSDate *date = [NSDate xh_dateWithDateString:self];
    return [NSString stringWithFormat:@"%ld時%02ld分",date.hour,date.minute];
}
-(NSString *)xh_formatFenMiao
{
    NSDate *date = [NSDate xh_dateWithDateString:self];
    return [NSString stringWithFormat:@"%02ld分%02ld秒",date.minute,date.seconds];
}
-(NSString *)xh_format_yyyy_MM_dd
{
   NSDate *date = [NSDate xh_dateWithDateString:self];
   return [NSString stringWithFormat:@"%ld-%02ld-%02ld",date.year,date.month,date.day];
}
-(NSString *)xh_format_yyyy_MM
{
    NSDate *date = [NSDate xh_dateWithDateString:self];
    return [NSString stringWithFormat:@"%ld-%02ld",date.year,date.month];
}
-(NSString *)xh_format_MM_dd
{
    NSDate *date = [NSDate xh_dateWithDateString:self];
    return [NSString stringWithFormat:@"%02ld-%02ld",date.month,date.day];
}
-(NSString *)xh_format_yyyy
{
    NSDate *date = [NSDate xh_dateWithDateString:self];
    return [NSString stringWithFormat:@"%ld",date.year];
}
-(NSString *)xh_format_HH_mm_ss
{
    NSDate *date = [NSDate xh_dateWithDateString:self];
    return [NSString stringWithFormat:@"%02ld:%02ld:%02ld",date.hour,date.minute,date.seconds];
}
-(NSString *)xh_format_HH_mm
{
    NSDate *date = [NSDate xh_dateWithDateString:self];
    return [NSString stringWithFormat:@"%02ld:%02ld",date.hour,date.minute];
}
-(NSString *)xh_format_mm_ss
{
    NSDate *date = [NSDate xh_dateWithDateString:self];
    return [NSString stringWithFormat:@"%02ld:%02ld",date.minute,date.seconds];
}

-(NSString *)xh_formatWeekDay
{
    NSString *weekStr=nil;
    NSDate *date = [NSDate xh_dateWithDateString:self];
    switch (date.weekday) {
        case 2:
            weekStr = @"星期一";
            break;
        case 3:
            weekStr = @"星期二";
            break;
        case 4:
            weekStr = @"星期三";
            break;
        case 5:
            weekStr = @"星期四";
            break;
        case 6:
            weekStr = @"星期五";
            break;
        case 7:
            weekStr = @"星期六";
            break;
        case 1:
            weekStr = @"星期天";
            break;
        default:
            break;
    }
    return weekStr;
}

五.調(diào)用:


    self.timeString = @"2017-04-16 13:08:06";
    
    //星期
    NSString *time0 = self.timeString.xh_formatWeekDay;
    
    //2017年04月16日
    NSString *time1 = self.timeString.xh_formatNianYueRi;
    
    //2017年04月
    NSString *time2 = self.timeString.xh_formatNianYue;
    
    //04月16日
    NSString *time3 = self.timeString.xh_formatYueRi;
    
    //2017年
    NSString *time4 = self.timeString.xh_formatNian;

    //13時08分01秒
    NSString *time5 = self.timeString.xh_formatShiFenMiao;
    
    //13時08分
    NSString *time6 = self.timeString.xh_formatShiFen;
    
    //08分01秒
    NSString *time7 = self.timeString.xh_formatFenMiao;
    
    //2017-04-16
    NSString *time8 = self.timeString.xh_format_yyyy_MM_dd;
    
    //2017-04
    NSString *time9 = self.timeString.xh_format_yyyy_MM;
    
    //04-16
    NSString *time10 = self.timeString.xh_format_MM_dd;
    
    //2017
    NSString *time11 = self.timeString.xh_format_yyyy;
    
    //13:08:06
    NSString *time12 = self.timeString.xh_format_HH_mm_ss;
    
    //13:08
    NSString *time13 = self.timeString.xh_format_HH_mm;
    
    //08:06
    NSString *time14 = self.timeString.xh_format_mm_ss;

代碼地址:https://github.com/CoderZhuXH/XHDate

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末则果,一起剝皮案震驚了整個濱河市幔翰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌西壮,老刑警劉巖遗增,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異茸时,居然都是意外死亡贡定,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門可都,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缓待,“玉大人蚓耽,你說我怎么就攤上這事⌒矗” “怎么了步悠?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瘫镇。 經(jīng)常有香客問我鼎兽,道長,這世上最難降的妖魔是什么铣除? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任谚咬,我火速辦了婚禮,結(jié)果婚禮上尚粘,老公的妹妹穿的比我還像新娘择卦。我一直安慰自己,他們只是感情好郎嫁,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布秉继。 她就那樣靜靜地躺著,像睡著了一般泽铛。 火紅的嫁衣襯著肌膚如雪尚辑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天盔腔,我揣著相機與錄音杠茬,去河邊找鬼。 笑死铲觉,一個胖子當(dāng)著我的面吹牛澈蝙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播撵幽,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼灯荧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了盐杂?” 一聲冷哼從身側(cè)響起逗载,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎链烈,沒想到半個月后厉斟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡强衡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年擦秽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡感挥,死狀恐怖缩搅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情触幼,我是刑警寧澤硼瓣,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站置谦,受9級特大地震影響堂鲤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜媒峡,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一瘟栖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丝蹭,春花似錦慢宗、人聲如沸坪蚁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽敏晤。三九已至贱田,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嘴脾,已是汗流浹背男摧。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留译打,地道東北人耗拓。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像奏司,于是被迫代替她去往敵國和親乔询。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 在iOS開發(fā)中韵洋,經(jīng)常會遇到各種各樣的時間問題竿刁,8小時時差,時間戳搪缨,求時間間隔食拜,農(nóng)歷等等。解決辦法網(wǎng)上比比皆是副编,但大...
    真巧了_嘿閱讀 2,772評論 0 7
  • iOS開發(fā)中负甸,經(jīng)常會遇到各種各樣的時間問題,8小時時差,時間戳呻待,求時間間隔煮盼,農(nóng)歷等等。解決辦法網(wǎng)上比比皆是带污,但大多...
    小李龍彪閱讀 6,333評論 1 6
  • Foundation框架中最常用的類僵控。 Foundation框架中最我們經(jīng)常用的類大致有NSString、NSAr...
    xx_cc閱讀 4,934評論 8 19
  • linux驅(qū)動:[3]高級字符設(shè)備驅(qū)動之ioctl 測試平臺: x86 PC linux-4.4.0 1.實驗?zāi)康?..
    techping閱讀 3,437評論 0 0