错误的时间...从时间戳开始
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()
— 用当前时间戳创建日期,你可以称它为 now
。
timeIntervalSinceNow
这里会是创建数据和调用方法的时间差,很小的值。
所以这个:
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...
只需将 DateFormatter
与 doesRelativeDateFormatting
设置为 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"
}
}
}
我将时间戳添加到 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()
— 用当前时间戳创建日期,你可以称它为 now
。
timeIntervalSinceNow
这里会是创建数据和调用方法的时间差,很小的值。
所以这个:
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...
只需将 DateFormatter
与 doesRelativeDateFormatting
设置为 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"
}
}
}