从未知时间戳转换为可读时间戳

时间:2014-01-15 05:13:17

标签: mysql ios objective-c ios7 timestamp

我在下面的列中包含从.sqlite文件

中检索的时间戳

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

实际上,如果我知道显示时间戳的格式,我可以弄清楚剩下的。

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

任何帮助?

更新1

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

更新2

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

更新3

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

2 个答案:

答案 0 :(得分:3)

这些是从某个时间开始经过的秒数。通常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 GMT以来经过的秒数,即Mac(OS X)世界中所谓的“参考日期”。该列不包含具有特定格式的字符串。

答案 1 :(得分:1)

如果第二个是自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格式化所需格式的日期。