用户多久以前创建了一个帖子,NSDate(),操作创建的“发布时间”的格式

时间:2016-08-26 16:48:32

标签: ios swift firebase firebase-realtime-database

我正在创建一个社交应用程序,将其帖子保存在用户特定节点中,我也节省了以这种格式发布的时间: -

2016年7月20日星期三,00:14

我在用户的朋友的全局Feed中显示帖子。

  • 在该帖子的24小时之前,我想在Feed上显示帖子的时间: - “5小时前”

  • 发布后24小时后,帖子会变成这样:“昨天” ......

  • 发布后48小时的帖子时间如下: - “8月5日” ...

到目前为止,我已经提出了这两个选项: -

1。)更改数据库中的Feed时间,我认为这是更好的选择。

2。)检索发布时间,迭代多个if条件并相应地设置发布时间。

我可以实现第二个选项,但我不知道如何推进第一个选项

鉴于我的JSON树是这样的

appname:{

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

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

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

                                  }
                     }
           }
     }
}

我偶然发现了http://momentjs.com/,但那是Javascript

在我的JSON树上还有任何建议,还是它的方式很好?

1 个答案:

答案 0 :(得分:4)

你建议:

  
      
  1. 更改数据库中的Feed时间,我认为这是更好的选择。
  2.   

不,数据库中的日期以及与Web服务通信的日期不应该是格式化的字符串。数据库和Web服务应该捕获原始日期(或者更确切地说,RFC3339 / ISO8601格式或某个参考日期的秒数)。 UI中字符串中已用时间的格式是应用程序的责任。

  
      
  1. 检索发布时间,如果是条件则迭代MULTIPLE并相应地设置发布时间。
  2.   

是的,这就是你应该做的。

顺便说一句,如果您要省略年份,您可能会有第四个排列,如果日期超过一年,则包括年份,例如:

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格式)返回发布日期。

在Swift 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)

或者在使用Swift 3的iOS 10+中,您可以使用新的ISO8601DateFormatter

let isoDateFormatter = ISO8601DateFormatter()