Преобразование метки времени из Firebase во время назад - PullRequest
0 голосов
/ 09 мая 2018

Когда пользователь нажимает на сообщение в ленте, я хочу отобразить время публикации каждого комментария. Я пытаюсь преобразовать значение Date (). TimeIntervalSince1970 в "x time ago", когда оно было опубликовано.

Перед просмотром загрузок я объявляю переменную now для текущей даты.

let now = Date()

Дата назначается, когда я настраиваю словарь для комментариев вроде.

let commentValues: [String: Any] = [
        "comment" : comment,
        "uid": uid,
        "commentDate": Date().timeIntervalSince1970
    ]

Я получаю такие комментарии, где я также вызываю функцию даты и назначаю ее метке даты в раскадровке.

var comments = [Comment]()
fileprivate func fetchComments() {

    guard let postID = self.post?.id else {return}
    let commentRef = Database.database().reference().child("comments").child(postID)
    commentRef.observe(.childAdded, with: { (snapshot) in

        guard let dict = snapshot.value as? [String: Any] else {return}
        guard let comment = dict["comment"] as? String else {return}
        guard let uid = dict["uid"] as? String else {return}
        guard let commentDate = dict["commentDate"] as? Double else {return}


        let userRef = Database.database().reference().child("users/\(String(describing: uid))/profile")
        userRef.observe(.value, with: { snapshot in
            guard let value = snapshot.value as? [String:Any] else {return}
            let username = value["username"]
            let uid = dict["uid"]
            let email = value["email"]

            let myTimeInterval = TimeInterval(commentDate)
            let time = Date(timeIntervalSinceNow: myTimeInterval)

            let userProfile = User(uid: uid as! String, username: username as! String, email: email as! String)
            let comment = Comment(uid: uid as! String, user: userProfile, comment: comment, time: time.timeAgoDisplay())
            self.comments.append(comment)
            self.commentCollectionView.reloadData()
            })
        })
}

Я установил расширение даты, в котором я пытаюсь вычислить время для даты:

extension Date {
func timeAgoDisplay() -> String {
        let secondsAgo = Int(Date().timeIntervalSince(self))

        let minute = 60
        let hour = 60 * minute
        let day = 24 * hour
        let week = 7 * day
        let month = 4 * week
        let year = 12 * month

        if secondsAgo < minute  {
            print("\(secondsAgo)s ago")
            return "\(secondsAgo)s ago"
        } else if secondsAgo < hour {
            return "\(secondsAgo)m ago"
        } else if secondsAgo < day {
            return "\(secondsAgo)hr ago"
        } else if secondsAgo < week {
            return "\(secondsAgo)d ago"
        } else if secondsAgo < month {
            return "\(secondsAgo)w ago"
        } else if secondsAgo < year {
            return "\(secondsAgo)mo ago"
        }
        return "\(secondsAgo)yr ago"
}
}

Дата отображается, но я получаю результат как -12983918s назад. Как отобразить время как «2 с. Назад», «1 ч. Назад» или «1 ч. Назад» и т. Д.

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Вам нужно преобразовать secondsAgo во второе, дату, месяц, год, ...: Вот идея для этого:

func timeAgoDisplay() -> String {
let secondsAgo = Int(Date().timeIntervalSince(self))
var result = ""
if secondsAgo >= 60 {
    let minutesAgo = secondsAgo / 60
    if minutesAgo >= 60 {
        let hoursAgo = minutesAgo / 60
        if hoursAgo >= 60 {
            let daysAgo = hoursAgo / 24
            if daysAgo >= 30 {
                let monthsAgo = daysAgo / 12
                if monthsAgo >= 12 {
                    let yearsAgo = monthsAgo / 12
                    result = "\(yearsAgo)y ago"
                } else { // months < 12
                    result = "\(monthsAgo)mo ago"
                }
            } else { // days < 30
                result = "\(daysAgo)d ago"
            }
        } else { // hours < 24
            result = "\(hoursAgo)h ago"
        }
    } else { // minutes < 60ms
        result =  "\(minutesAgo)m ago"
    }
} else { // seconds < 60s
    result = "\(secondsAgo)seconds ago"
}
return result
}

Надеюсь, что это полезно

0 голосов
/ 09 мая 2018

Вот пример использования Calendar.component для дифференциации возможных временных результатов.

if let timestamp = post?.timestamp {
        print(timestamp)
        let timestampDate = Date(timeIntervalSince1970: Double(timestamp))
        let now = Date()
        let components = Set<Calendar.Component>([.second, .minute, .hour, .day, .weekOfMonth])
        let diff = Calendar.current.dateComponents(components, from: timestampDate, to: now)

        var timeText = ""
        if diff.second! <= 0 {
            timeText = "Now"
        }
        if diff.second! > 0 && diff.minute! == 0 {
            timeText = (diff.second == 1) ? "\(diff.second!) second ago" : "\(diff.second!) seconds ago"
        }
        if diff.minute! > 0 && diff.hour! == 0 {
            timeText = (diff.minute == 1) ? "\(diff.minute!) minute ago" : "\(diff.minute!) minutes ago"
        }
        if diff.hour! > 0 && diff.day! == 0 {
            timeText = (diff.hour == 1) ? "\(diff.hour!) hour ago" : "\(diff.hour!) hours ago"
        }
        if diff.day! > 0 && diff.weekOfMonth! == 0 {
            timeText = (diff.day == 1) ? "\(diff.day!) day ago" : "\(diff.day!) days ago"
        }
        if diff.weekOfMonth! > 0 {
            timeText = (diff.weekOfMonth == 1) ? "\(diff.weekOfMonth!) week ago" : "\(diff.weekOfMonth!) weeks ago"
        }

        timeLabel.text = timeText
    }

В этом примере добавляется временная метка «сообщения» ... но вы можете использовать ту же логику для комментариев. Дайте ему знать и дайте мне знать, если у вас есть какие-либо вопросы. Ура! * * 1004

Редактировать: включая документацию на Calendar.component https://developer.apple.com/documentation/foundation/calendar.component

...