错误的时间...从时间戳开始

Wrong time since.. from timestamp

我将时间戳添加到 Firebase 数据库,格式如下:1476700050.83933

所以我想计算自创建此时间戳以来的时间,但是作为输出我得到如下内容:1969-12-31 23:32:04 +0000

它看起来有点正确,但我如何能够将它现在转换为 5 分钟前的样子,等等。

我是这样计算的:

let timestamp = postsArray[indexPath.row].timestamp//query timestamp from Firebase
let date = NSDate(timeIntervalSince1970: timestamp! )//Readable date
let timeSincePost = (NSDate().timeIntervalSinceNow-NSDate().timeIntervalSince(date as Date))//Calculate time since
print("TimeSince", NSDate(timeIntervalSince1970: timeSincePost))

我在许多语言中遇到过许多类似的问题,但它们是如此不同。我做错了吗?

NSDate().timeIntervalSinceNow return 值接近 0.

NSDate() — 用当前时间戳创建日期,你可以称它为 nowtimeIntervalSinceNow这里会是创建数据和调用方法的时间差,很小的值。

所以这个:

NSDate().timeIntervalSinceNow-NSDate().timeIntervalSince(date as Date)

可以这样看:

0 - now.timeIntervalSince(date as Date)

对于过去的所有日期 now.timeIntervalSince(date as Date) 都是正数,并且 0 - positive = negative

最后,您从 1970 年 1 月 1 日开始减去时间间隔,得到 1969 年的日期。顺便说一句,您为什么要这样做?

另外,在Swift3中停止使用NSDate,只使用Date

并使用this method进行timeSincePost计算。

how I am able to convert it now to like 5 minutes ago etc...

只需将 DateFormatterdoesRelativeDateFormatting 设置为 true 并使用您通过 Firebird 时间戳获得的原始日期获得 stringFromDate

首先,与:

let timeSincePost = (NSDate().timeIntervalSinceNow-NSDate().timeIntervalSince(date as Date))//Calculate time since

您从当前时间减去指定的日期,例如结果为 5 秒。然后:

print("TimeSince", Date(timeIntervalSince1970: timeSincePost))

你距离原点还有 5 秒。您遇到的问题是什么。


NSDate 有 timeIntervalSince(_:) 方法来获取两个日期之间的差异。节省手动计算:

let interval = Date().timeIntervalSince(date)

这给出了以秒为单位的差异。要计算天数和分钟数等,请使用 NSDateComponents. See this 获取有关如何使用它的有用指南。

我有类似的要求,所以为此添加了日期扩展:

public extension NSDate {
   public func elapsedTimeString(toDate: NSDate? = NSDate()) -> String {

    let distanceBetweenDates = toDate!.timeIntervalSinceDate(self)
    let minutes = distanceBetweenDates / 60

    switch minutes {
    case 0..<1:
        return "now"
    case 1..<60:
        return "Int64(minutes) mins ago"
    case 60..<(60 * 24):
        return "Int64(minutes / 60) hour(s) ago"
    case (60 * 24)..<(60 * 24 * 7):
        return "Int64(minutes / (60 * 24)) week(s) ago"
    default:
        // somehow the date is ahead? so consider it now
        if minutes < 0 {
            return "now"
        }
        return "Int64(minutes / (60 * 24 * 7)) week(s) ago"
    }
   }
}