【问题标题】:Wrong time since.. from timestamp错误的时间,因为......从时间戳
【发布时间】:2017-02-26 08:29:15
【问题描述】:

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

我用多种语言解决了许多类似的问题,但它们都大相径庭。我做错了吗?

【问题讨论】:

标签: ios swift nsdate nstimeinterval


【解决方案1】:

NSDate().timeIntervalSinceNow返回值接近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 年的日期。顺便说一句,你为什么这样做?

另外,在 Swift 3 中停止使用 NSDate,只需使用 Date

并使用this method 进行timeSincePost 计算。

我现在如何将其转换为 5 分钟前等...

只需使用 DateFormatter 并将 doesRelativeDateFormatting 设置为 true 并获取带有 Firebird 时间戳的原始日期的 stringFromDate

【讨论】:

  • 我这样做是因为我想在 feed 上发帖后有时间 :)
  • @TarvoMäesepp,但我无法连接time since post on feedtimeIntervalSince1970。自发布日期以来您已经有秒数,为什么需要将其与 01.01.1970 相关联?
  • 你对"now."? 的回答是什么意思并回答你的问题.. 像这样我应该得到时间,因为发布了时间戳或者我错了?那你有什么建议呢?
  • @TarvoMäesepp, now 现在是当前时间,当调用 NSDate() 时,您将获得当前时刻的时间戳。在引用之后,建议就在答案中。
【解决方案2】:

首先,用:

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。请参阅 this 以获取有关如何使用它的有用指南。

【讨论】:

    【解决方案3】:

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

    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"
        }
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-12
      • 2013-12-22
      • 2014-08-21
      • 2015-01-29
      • 1970-01-01
      • 2019-10-20
      • 1970-01-01
      相关资源
      最近更新 更多