Ios 从SqLite数据库中的整数字段格式化日期(iTunes备份)

Ios 从SqLite数据库中的整数字段格式化日期(iTunes备份),ios,sql,sqlite,itunes,Ios,Sql,Sqlite,Itunes,我正在使用SQLite Maestro查看我昨天的iPhone备份文件,日期字段显示整数-例如,我最后一条短信的日期显示为404076049。如何将其转换为可读的日期时间? 我在某个地方找到了一个示例选择strftime(“%m-%d-%Y”,date\u col,'unixepoch')作为date\u col,但它将上述数字转换为12-31-1982,这肯定是错误的(日期应该是昨天的某个时间) 有什么想法吗?Mac使用的“纪元时间”与UNIX纪元时间不同 UNIX纪元日期为UTC 1970年

我正在使用SQLite Maestro查看我昨天的iPhone备份文件,日期字段显示整数-例如,我最后一条短信的日期显示为404076049。如何将其转换为可读的日期时间? 我在某个地方找到了一个示例
选择strftime(“%m-%d-%Y”,date\u col,'unixepoch')作为date\u col
,但它将上述数字转换为12-31-1982,这肯定是错误的(日期应该是昨天的某个时间)

有什么想法吗?

Mac使用的“纪元时间”与UNIX纪元时间不同

UNIX纪元日期为UTC 1970年1月1日午夜(又称格林威治标准时间)

Mac OS的纪元日期为UTC 2001年1月1日午夜

我不知道如何使用SQL语句将日期从整数格式转换为日期字符串,但我知道如何使用Cocoa:

NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate: intValue];
您应该能够计算两个日期系统之间的差异,并将其作为转换系数:

NSDate *date = [NSDate date];
NSTimeInterval secondsSince2001 = [date timeIntervalSinceReferenceDate];
NSTimeInterval secondsSince1970 = [date timeIntervalSince1970];
long int difference = trunc(secondsSince2001 - secondsSince1970);
然后,您可以在select语句中使用整数值之前添加“差”。

Mac使用的“历元时间”与UNIX历元时间不同

UNIX纪元日期为UTC 1970年1月1日午夜(又称格林威治标准时间)

Mac OS的纪元日期为UTC 2001年1月1日午夜

我不知道如何使用SQL语句将日期从整数格式转换为日期字符串,但我知道如何使用Cocoa:

NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate: intValue];
您应该能够计算两个日期系统之间的差异,并将其作为转换系数:

NSDate *date = [NSDate date];
NSTimeInterval secondsSince2001 = [date timeIntervalSinceReferenceDate];
NSTimeInterval secondsSince1970 = [date timeIntervalSince1970];
long int difference = trunc(secondsSince2001 - secondsSince1970);

然后,在select语句中使用整数值之前,您可以将“差”添加到整数值中。

因此,根据Audrey的评论,在SQL中执行此操作(在MacOS Mohave中使用新的纳秒时间戳):


根据Audrey的评论,要在SQL中实现这一点(在MacOS Mohave中使用新的纳秒时间戳):


但你给了我一个想法——这两个epoh日期之间的差异是978307200秒。因此,我可以将它添加到我的INT date中:
选择strftime(“%m-%d-%Y”,date+978307200,'unixepoch')作为date\u 1
。我正在核对你的答案,谢谢!Andrey的SQL对我来说工作得很好——我正在根据我从iphone备份中获取的短信历史记录构建一个短信日志。iPhone不显示每条消息的实际时间戳是愚蠢的,但这种方法让我可以直接导出到具有准确时间的电子表格。我希望所有信息都在一行中,因此:
sqlite3-csv-header filename'select message.handle\u id,message.subject,message.text,strftime(“%m-%d-%Y,%H:%m”,message.date+978307200,“unixepoch”)作为日期_1,message.is_from_me,handle.rowid,handle.id from message,handle where message.handle_id=handle.rowid;'更新Audrey的Mohave SQL(以及年/月/日):
从消息中选择strftime(%Y-%m-%d),(date+978307200000000000)/100000000,'unixepoch')作为日期,但您给了我一个想法-这两个epoh日期之间的差异是978307200秒。因此,我可以将它添加到我的INT date中:
选择strftime(“%m-%d-%Y”,date+978307200,'unixepoch')作为date\u 1
。我正在核对你的答案,谢谢!Andrey的SQL对我来说工作得很好——我正在根据我从iphone备份中获取的短信历史记录构建一个短信日志。iPhone不显示每条消息的实际时间戳是愚蠢的,但这种方法让我可以直接导出到具有准确时间的电子表格。我希望所有信息都在一行中,因此:
sqlite3-csv-header filename'select message.handle\u id,message.subject,message.text,strftime(“%m-%d-%Y,%H:%m”,message.date+978307200,“unixepoch”)作为日期_1,message.is_from_me,handle.rowid,handle.id from message,handle where message.handle_id=handle.rowid;'更新Audrey的Mohave SQL(以及年/月/日):
选择strftime(%Y-%m-%d),(date+978307200000000000)/100000000,'unixepoch')作为消息中的日期1