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

时间:2016-10-17 11:15:00

标签: ios swift nsdate nstimeinterval

我将时间戳添加到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))

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

3 个答案:

答案 0 :(得分: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分钟之前等...

只需将DateFormatterdoesRelativeDateFormatting设置为true即可,并使用Firebird时间戳记的原始日期获取stringFromDate

答案 1 :(得分:1)

首先,用:

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

答案 2 :(得分:0)

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

/**
 * Only allow one concurrent session per user
 *
 * @param  Request  $request
 * @param  User  $user
 * @return Response
 */
protected function authenticated(Request $request, User $user)
{
    Session::put('user_id', $user->id);

    $files = array_diff(scandir(storage_path('framework/sessions')), array('.', '..', '.gitignore'));

    foreach ($files as $file) {
        $filepath = storage_path('framework/sessions/' . $file);
        $session = unserialize(file_get_contents($filepath));

        if ($session['user_id'] === $user->id && $session['_token'] !== Session::get('_token')) {
            unlink($filepath);
        }
    }

    return redirect()->intended($this->redirectPath());
}