我正在创建一个社交应用程序,将其帖子保存在用户特定节点中,我也节省了以这种格式发布的时间: -
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树上还有任何建议,还是它的方式很好?
答案 0 :(得分:4)
你建议:
- 更改数据库中的Feed时间,我认为这是更好的选择。
醇>
不,数据库中的日期以及与Web服务通信的日期不应该是格式化的字符串。数据库和Web服务应该捕获原始日期(或者更确切地说,RFC3339 / ISO8601格式或某个参考日期的秒数)。 UI中字符串中已用时间的格式是应用程序的责任。
- 检索发布时间,如果是条件则迭代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
格式)返回发布日期。
在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()