Formato de fechas en el chat.db de Message

Estoy trabajando para mejorar mi secuencia de comandos de copia de seguridad de iMessages . /Users/Kyro/Library/Messages/chat.dbtiene una tabla messagecon todos los mensajes y algunas fechas.

¿Alguna idea de cuál es el formato de fecha? Primero pensé en una marca de tiempo (tengo, por ejemplo 408978598), pero date -r 408978598devolví una fecha en 1982.

Respuestas (4)

Descubrí que a partir de High Sierra, necesitaba usar una transformación de fecha diferente. Los 8 0 adicionales en el campo de fecha frente al campo date_read fueron la pista:

datetime(message.date/1000000000 + strftime("%s", "2001-01-01") ,"unixepoch","localtime") 
Sí, ahora es un campo de nanosegundos.
A partir de 2018, esta respuesta funciona como se esperaba.
A partir de 2019, esta respuesta funciona como se esperaba.
A partir de 2020, esta respuesta funciona como se esperaba.
A partir de 2021, esta respuesta funciona como se esperaba. 🎉
A partir de 2022, esta respuesta funciona como se esperaba.

Para agregar a la respuesta útil de @Matthieu, aquí se explica cómo convertirlo dentro de SQLLite:

datetime(date + strftime('%s','2001-01-01'), 'unixepoch')

Por ejemplo:

select
  is_from_me,
  datetime(date + strftime('%s','2001-01-01'), 'unixepoch') as date_utc,
  text
from message;
Esto no me funciona, todas las fechas tienen el año -1400

bien usando la fecha de coreUtils :

Encontré lo que buscaba:

$gdate -ud "2001-01-01 + 408978598 seconds" 
Tue Dec 17 13:09:58 UTC 2013

Es una marca de tiempo con fecha base 1 de enero de 2001.

Para verlo en su zona horaria local predeterminada, omita la -uopción y agregue el indicador de zona horaria UTC a la cadena de fecha:$ gdate -d "2001-01-01Z + 408978598 seconds"

En el script al que se refiere, puede lograr una marca de tiempo de la siguiente manera: datetime(date + strftime('%s', '2001-01-01 00:00:00'), 'unixepoch', 'localtime') como fecha desde el mensaje: para ingresar en la hora local si eso es lo que está buscando.