2012-05-24 12 views
10

Si bien esta no es una pregunta de programación en sí, está relacionada.Analizando el campo "fecha" del archivo SMS de iPhone desde la copia de seguridad

Así que estoy tratando de averiguar cómo analizar el DB de SMS que se respalda desde el iPhone. Estoy mirando la tabla de "mensajes", específicamente el campo "fecha". Noté que los mensajes más recientes están usando un sistema de numeración diferente para indicar la fecha/hora. Lo he reducido al cambio a iMessage, ya que tengo un mensaje enviado al 1318470904, con una respuesta enviada al 340164736. Sé con certeza que estos mensajes se enviaron con menos de una hora de diferencia, sin embargo, están indicando> 30 años de diferencia

¿Alguien sabe cómo calcular con precisión la fecha usando este sistema más nuevo? ¿Está usando una época diferente o hay algunas matemáticas locas que necesito hacer?

Editar: Los mensajes recientes también se ven afectados. Los textos (burbujas verdes) se almacenan con la fecha establecida normalmente, y cualquier cosa a través de iMessage (burbujas azules) se almacena con la representación de diferentes fechas.

+0

Jailbroken, ¿sí? – GoZoner

+0

No, no tiene jailbreak, ni estaba en el momento de los mensajes. Obtengo la información del archivo 3d0d ... en el directorio de copia de seguridad de iPhone. –

Respuesta

7

Está en segundos desde 1/1/2001 en lugar de los otros que están basados ​​en Unix fuera de 1/1/1970. Entonces, para convertirlo a decir un tiempo de Excel, su fórmula sería = Celda/(60 * 60 * 24) + "1/1/2001".

0

Puede haber otra respuesta.

=Cell/(60*60*24) + "1/1/1970"

obras con mi versión actual del iPhone/iOS => 4.3.3

0

Fomurla con hora de los mensajes: = celular/(60 * 60 * 24) + "1/1/2001 07:00"

12

Dado que la copia de seguridad se exporta a formato de base de datos SQLite, aquí es cómo convertir el número en una fecha real en SQLite:

select 
    datetime(date + strftime('%s', '2001-01-01 00:00:00'), 
     'unixepoch', 'localtime') as date, 
    * 
from message 
0

Apple usa Mac Absolute Time (MacTime). Esto se cuenta del 01-01-2001. La otra marca de tiempo que ve es UnixTime. Esto comienza desde 01-01-1970.

Tienes que agregar 31 años a MacTime para obtener UnixTime. Esto es un PHP-snippit:

$macTime = $d['ZMESSAGEDATE']; // MacTime column (from Whatsapp) 
$unixTime = $macTime + 978307200; 
echo date("Y-m-d H:i:s", $unixTime); 

Se calcula la diferencia de tiempo el uso de este sitio web: https://www.timeanddate.com/date/durationresult.html?d1=1&m1=1&y1=1970&d2=1&m2=1&y2=2001&h1=0&i1=0&s1=0&h2=0&i2=0&s2=0

0

Bohemia ♦ es correcta, pero hay un pequeño error en su respuesta:

utilización% S (mayúsculas) en lugar de% s, ya que el tiempo se representa en segundos desde 2001 y no en 1970.

Doc de https://www.sqlite.org/lang_datefunc.html

%s  seconds since 1970-01-01 
%S  seconds: 00-59 

seleccionar de fecha y hora (fecha + strftime ('% S', '2001-01-01 00:00:00'), 'unixepoch', 'localtime ') como fecha, * del mensaje

+1

acaba de probar su ejemplo en la consulta de SQLite y da resultados incorrectos con "% S", mientras que "% s" da resultados correctos. – Andrey

0

Dado que la fecha en mac se calcula a partir de 2001 y no 1970, tenemos que agregar algo extra a esta fecha de mac.

978307200000 es equivalente a milisegundos hasta 2001-01-01

también multiplicando por 1,000 es necesario para convertir a milisegundos.

macDate * 1000 + 978307200000 
0

No sé acerca de cómo obtener la fecha correcta dado dos versiones presentes, pero cuando lo hice hoy, me di cuenta de la columna de la date no era el tiempo estándar de Unix, pero un número más largo aparentemente con nueve ceros al fin, como 444548608000000000. Esto es lo que hice para obtener la fecha correcta:

select 
    datetime(substr(date, 1, 9) + 978307200, 'unixepoch', 'localtime') as f_date, 
    text 
from message 
Cuestiones relacionadas