【问题标题】:Convert from an unknown timestamp to a readable timestamp从未知时间戳转换为可读时间戳
【发布时间】:2014-01-15 05:13:17
【问题描述】:

下面的列包含从.sqlite 文件中检索到的时间戳,

这些时间戳的格式是什么?如何将它们转换为可读的时间戳?

实际上,如果我知道显示的时间戳的格式,我就能弄清楚其余的。

我已尝试将其粘贴到在线时间戳转换工具中,但转换器无法识别特定格式。 我最初认为时间戳的格式是YYYYMMDDHHMMSS.uuuuuu,但是数字的长度与格式的长度不对应,所以我在这个问题上摸不着头脑

有什么帮助吗?

更新 1

这些时间戳对应于消息,因此很明显,该时间戳中必须至少保留分钟和秒。

更新 2

这些时间戳来自我从 .sqlite 文件中检索到的消息传递应用程序

更新 3

根据提供的其他列(例如名称和消息),我能够验证时间戳是否与应用程序内的消息时间戳相关,11/28/2012 10:48am 我无法验证秒数。

【问题讨论】:

  • 你甚至不知道你的数据来自哪里,你在问你的数据是什么格式的?呵呵……
  • @BlueTomato 抱歉,它来自消息应用程序伙伴。我查看了 .sqlite 文件并找到了该列。
  • 这些数字不是自 1970 年 1 月以来的总秒数,除非 1980 年代初期的日期对您有任何意义。那么谁知道呢!?
  • 它们可能是自 2001 年 1 月 1 日(也称为 NSDate 的参考日期)以来的秒数。如果为 true,则此处的时间戳范围从 2012-11-28 10:48:55 到 2012-11-28 11:25:43 (GMT)。

标签: mysql ios objective-c ios7 timestamp


【解决方案1】:

这些是自特定时间以来经过的秒数。通常 1970 年 1 月 1 日 0:00 是第一秒。但在这种情况下,这将是一个没有多大意义的日期,因为第一个时间戳是Sat, 28 Nov 1981 10:48:55 GMT。告诉我们应用程序显示第一个时间戳的内容,计算参考日期将很容易。

可能是 2001 年 1 月 1 日,因为它是另一个经常使用的参考日期。即在 Mac OS X 和 iOS 上。

NSDate *date  = [NSDate dateWithTimeIntervalSinceReferenceDate:timestampFromDB];

我写了一个测试程序。

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        NSTimeInterval intervals[] = {375792535.395, 375792980.868017};
        for (int i = 0; i < sizeof(intervals)/sizeof(intervals[0]); ++i) {
            NSTimeInterval interval = intervals[i];
            NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:interval];
            NSLog(@"%@", date);
        }
    }
    return 0;
}

日志:

2012-11-28 10:48:55 +0000
2012-11-28 10:56:20 +0000

前两个时间戳。请检查,这是否是应用程序中显示的日期。

结论:

数据库保存双精度值来表示自格林威治标准时间 1.1.2001 0:00 以来经过的秒数,这在 Mac (OS X) 世界中称为“参考日期”。该列不包含特定格式的字符串。

【讨论】:

  • 因此时间戳表示自 1.1.2001 0:00GMT 以来经过的秒数,称为reference date,不是格式!这真的很酷@vikingosegundo!我确实检查了应用程序,在我的发现之后,我确认生成的日志与 GUI 上的时间戳相匹配。所以它肯定是从您指定的参考日期开始的!再次感谢
【解决方案2】:

如果第二个是自 1970 年以来,您可以使用 + (instancetype)dateWithTimeIntervalSince1970:(NSTimeInterval)seconds

NSLog(@"%@",[NSDate dateWithTimeIntervalSince1970:375792535.395])

输出:

1981-11-28 10:48:55 +0000

看来你的第二个是自 2001 年以来(正如 @vikingosegundo 在他的回答中提到的),所以你可以使用

+(instancetype)dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)seconds

例子:

NSLog(@"%@", [NSDate dateWithTimeIntervalSinceReferenceDate:375792535.395]);

输出:

2012-11-28 11:24:51 +0000

然后您可以使用NSDateFormatter 将日期格式化为所需格式。

【讨论】:

  • 你可能会离开 31 年
  • @vikingosegundo:给定时间戳的对应时间是该日期,但如果他使用其他年份(不是 1970 年)作为参考日期,那么您是正确的。
  • 当他说数据来自消息应用程序时,这些数字是从 1970 年 1 月开始的总秒数的可能性有多大?接近 0...
  • 那么什么 iOS 聊天应用会从 80 年代初开始有时间戳?也许是一些 beta 测试应用?
  • 阅读我的回答,我认为很明显这是 NSDates 参考日期。那是 31 年后的事了。
猜你喜欢
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-20
  • 2013-08-13
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多