ios開發-日期處理(類似朋友圈,微博等的發送時間)

jopen 9年前發布 | 34K 次閱讀 iOS開發 移動開發 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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!