2016-08-26 58 views
1

我正在製作社交應用程序,將其帖子保存在用戶特定節點中,我也保存後此格式時間: -用戶創建一個帖子,NSDate(),操縱創建「帖子時間」的格式多久之前

週三年,2016年7月20日00:14

,我與用戶的朋友的全球飼料後顯示。

  • 24小時內帖子之前,我想對飼料,因爲這顯示發帖時間: - 「5個小時前」

  • 後24小時後的那個帖子時間變是這樣的: - 「昨天」 ...

  • 48小時後的那個帖子時間之後變得像這樣: - 「在8月5日」 ...

到目前爲止,我想出了這兩個選項: -

1)更改數據庫中的飼料,我覺得這是更好的選擇的時候。

2.)檢索發佈時間,遍歷多個if條件並相應地設置發佈時間。

我將能夠實現第二個選項,但我不知道應該如何進行選擇向前走一

鑑於我的JSON樹是這樣的

appname:{ 

    users : {.... 
      ..... 

    user1 : {.... 
      ..... 

      postsCreated : { 
          post1 : { 
            .. 
            timeofPost : ""Wednesday, Aug 5, 2016, 00:14""  

            } 
        } 
      } 
    } 
} 

我沒有在絆倒http://momentjs.com/但那是爲Javascript

還有我的JSON樹上的任何建議還是它的方式是好的?

回答

4

您建議:

  1. 更改數據庫中的飼料,我覺得這是更好的選擇的時候。

不,在數據庫中的日期,以及作爲其被傳與Web服務,不應該是一個格式化字符串。數據庫和Web服務應該捕獲原始日期(或者更精確地說,RFC3339/ISO8601格式或某個參考日期的秒數)。用戶界面字符串中已用時間的格式是應用程序的責任。

  1. 檢索帖子的時間,如果條件反覆遍歷MULTIPLE並相應地設置帖子的時間。

是的,這就是你應該做的。

順便說一句,如果你要省略年份,你可能有第四個排列,其中包括今年如果日期是在過去的一年多,比如:

func formattedPostDateString(date: NSDate) -> String { 
    let now = NSDate() 
    let elapsed = NSCalendar.currentCalendar().components([.Day, .Year], fromDate: date, toDate: now, options: []) 

    switch (elapsed.year, elapsed.day) { 
    case (0, 0): 
     return "\(elapsedFormatter.stringFromDate(date, toDate: now)!) \(agoDateString)" 
    case (0, 1): 
     return yesterdayString 
    case (0, _): 
     return "\(onDateString) \(lessThanOneYearFormatter.stringFromDate(date))" 
    default: 
     return "\(onDateString) \(moreThanOneYearFormatter.stringFromDate(date))" 
    } 
} 

let onDateString = NSLocalizedString("On", comment: "prefix used in 'On 5 Aug'") 
let agoDateString = NSLocalizedString("ago", comment: "suffix use in '4 hours ago'") 
let yesterdayString = NSLocalizedString("Yesterday", comment: "showing 'date' where it's between 24 and 48 hours ago") 

let elapsedFormatter: NSDateComponentsFormatter = { 
    let formatter = NSDateComponentsFormatter() 
    formatter.allowedUnits = [.Year, .Month, .Day, .Hour, .Minute, .Second] 
    formatter.unitsStyle = .Full 
    formatter.maximumUnitCount = 1 
    return formatter 
}() 

let lessThanOneYearFormatter: NSDateFormatter = { 
    let formatter = NSDateFormatter() 
    formatter.dateFormat = NSDateFormatter.dateFormatFromTemplate("MMM d", options: 0, locale: nil) 
    return formatter 
}() 

let moreThanOneYearFormatter: NSDateFormatter = { 
    let formatter = NSDateFormatter() 
    formatter.dateStyle = .MediumStyle 
    return formatter 
}() 

您唯一需要做的就是將Web服務返回的字符串轉換爲NSDate對象。爲此,Web服務可能應該以ISO 8601/RFC 3339格式(例如2016-08-26T15:01:23Z格式)返回發佈日期。


要斯威夫特2創建ISO8601/RFC3339日期:

let isoDateFormatter: NSDateFormatter = { 
    let formatter = NSDateFormatter() 
    formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") 
    formatter.timeZone = NSTimeZone(forSecondsFromGMT: 0) 
    formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ" 
    return formatter 
}() 

然後:

let string = isoDateFormatter.stringFromDate(date) 

或者

let date = isoDateFormatter.dateFromString(string) 

或者在iOS中使用10+ 3斯威夫特,你可以使用新的ISO8601DateFormatter

let isoDateFormatter = ISO8601DateFormatter() 
+0

感謝您的詳細回覆:) @Rob – Dravidian