ios開發-日期處理(類似朋友圈,微博等的發送時間)
ios開發中,我們經常要處理從服務器獲取的時間。類似朋友圈,微博這些應用。我們經常可以看到“剛剛”,“31分鐘前發表”,“昨天5點”,之類的字樣。
當時我們從服務器端獲取的都是那條朋友圈信息,或者微博的創建時間。所以我們每次顯示數據的時候,都需要根據跟當前的時間做對比,按照格式,算出
我們想要的結果。
例如,我們從服務器獲取的時間,大概都類似于 Sun May 24 12:12:00 +0800 2015
我們還是先詳細說明一下 日期格式 吧
- 年
- y 將年份 (0-9) 顯示為不帶前導零的數字
- yy 以帶前導零的兩位數字格式顯示年份
- yyy 以四位數字格式顯示年份
- yyyy 以四位數字格式顯示年份
- 月
- M 將月份顯示為不帶前導零的數字(如一月表示為 1)
- MM 將月份顯示為帶前導零的數字(例如 01/12/01)
- MMM 將月份顯示為縮寫形式(例如 Jan)
- MMMM 將月份顯示為完整月份名(例如 January)
- 一月 Jan January
- 二月 Feb February
- 三月 Mar March
- 四月 Apr April
- 五月 May May
- 六月 Jun June
- 七月 Jul July
- 八月 Aug August
- 九月 Sep September
- 十月 Oct October
- 十一月 Nov November
- 十二月 Dec December
- 日
- d 將日顯示為不帶前導零的數字(如 1)
- dd 將日顯示為帶前導零的數字(如 01)
- 星期
- EEE 將日顯示為縮寫形式(例如 Sun)
- EEEE 將日顯示為全名(例如 Sunday)
- 星期一 Mon Monday
- 星期二 Tue Tuesday
- 星期三 Wed Wednesday
- 星期四 Thu Thursday
- 星期五 Fri Friday
- 星期六 Sat Saturday
- 星期天 Sun Sunday
- 小時
- h 使用 12 小時制將小時顯示為不帶前導零的數字(例如 1:15:15 PM)
- hh 使用 12 小時制將小時顯示為帶前導零的數字(例如 01:15:15 PM)
- H 使用 24 小時制將小時顯示為不帶前導零的數字(例如 1:15:15)
- HH 使用 24 小時制將小時顯示為帶前導零的數字(例如 01:15:15)
- 分鐘
- m 將分鐘顯示為不帶前導零的數字(例如 12:1:15)
- mm 將分鐘顯示為帶前導零的數字(例如 12:01:15)
- 秒
- s 將秒顯示為不帶前導零的數字(例如 12:15:5)
- ss 將秒顯示為帶前導零的數字(例如 12:15:05)
- f 顯示秒的小數部分
- ff 將精確顯示到百分之一秒
- ffff 將精確顯示到萬分之一秒
- 用戶定義格式中最多可使用七個 f 符號
- 上午&下午
- t 使用 12 小時制
- 中午之前任一小時顯示大寫的 A
- 中午到 11:59 PM 之間的任一小時顯示大寫的 P
- tt 對于使用 12 小時制的區域設置
- 中午之前任一小時顯示大寫的 AM
- 中午到 11:59 PM 之間的任一小時顯示大寫的 PM
- 對于使用 24 小時制的區域設置,不顯示任何字符
- 時區
- z 顯示不帶前導零的時區偏移量
- zz 顯示帶前導零的時區偏移量(例如 -08)
- zzz 顯示完整的時區偏移量(例如 -0800)
- 紀元
- gg 顯示時代/紀元字符串(例如 A.D.)
理解完上面的知識之后,我們就可以寫代碼了。預先制定一下需求吧
剛剛 ( 一分鐘內 )
X 分鐘前 ( 一小時內 )
X 小時前 ( 當天 )
昨天 HH:mm( 昨天 )
MM-dd( 當年 )
yyyy-MM-dd HH:mm( 更早期 )
第一步:我們一個日期NSDate的分類,然后先寫一個類方法,將從服務器的時間數據轉成NSDate(代碼繼續用swift練練)
我們先按照“ Sun May 24 12:12:00 +0800 2015 ”這個格式舉例
///使日期字符串 創建NSDate class func createDate(fullDateString:String)->NSDate?{ //創建fomater let ft = NSDateFormatter() //設置本地化 // 2. 要指定日期的地區,Xcode 6.3 beta 還不需要,地區需要指定英語 // 注意:在真機調試的時候,一定要指定區域,否則以前版本同樣無法轉換 ft.locale = NSLocale(localeIdentifier: "en") //設置日期格式 ft.dateFormat = "EEE MMM dd HH:mm:ss zzz yyyy" //生成日期 return ft.dateFromString(fullDateString) }
第二步:再在NSDate分類中創建對象方法(函數),正式處理時間, 里面要用到NSCalendar類(日歷)
func fullDescription()->String{ //用日歷類獲得當前的日期 let calendar = NSCalendar.currentCalendar() //創建datefomater let ft = NSDateFormatter() //當天 if calendar.isDateInToday(self){ //獲取日期與當前時間的差值 let delta = Int(NSDate().timeIntervalSinceDate(self)) if delta < 60 { return "剛剛" } if delta < 3600{ return "\(delta/60)分鐘前" } return "\(delta/3600)小時前" } //昨天 if calendar.isDateInYesterday(self){ ft.dateFormat = "昨天 HH:mm" return ft.stringFromDate(self) } //計算年度差值 let coms = calendar.components(NSCalendarUnit.CalendarUnitYear, fromDate: NSDate(), toDate: self, options: NSCalendarOptions(0)) //今年 if coms.year == 0 { ft.dateFormat = "MM-dd" return ft.stringFromDate(self) } //剩下的都是往年了 ft.dateFormat = "yyyy-MM-dd HH:mm" return ft.stringFromDate(self) }
第三步:上面兩個方法都寫完之后,每次只要調用即可獲得想要的數據了
想要的數據 = NSDate.createDate("服務器記錄的創建時間").fullDescription()
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!