Conversor de Core Data para timestamp Unix
Converta Core Data em tempo Unix com a fórmula exata e suporte para valores grandes. Saída em segundos, milissegundos, ISO 8601 e formato legível.
segundos desde 01-01-2001 UTC
O que é uma marca de tempo do Core Data?
O framework Core Data da Apple armazena atributos Date como o número de segundos desde 1º de janeiro de 2001 00:00:00 UTC — a mesma data de referência CFAbsoluteTime usada no macOS e no iOS. Quando você abre um armazenamento do Core Data diretamente no SQLite, as colunas de data (frequentemente chamadas Z…DATE) aparecem como esses valores de ponto flutuante baseados em 2001.
- Época: 2001-01-01 00:00:00 UTC
- Tipo: segundos em ponto flutuante (precisão abaixo do segundo preservada)
- Visto em: armazenamentos SQLite do Core Data, colunas ZDATE / Z_…_DATE, bancos .sqlite exportados
- Data de referência idêntica a NSDate timeIntervalSinceReferenceDate
Como converter uma marca de tempo do Core Data em tempo Unix
Some a diferença de 978.307.200 segundos entre 1970 e 2001 para rebasear um valor do Core Data na época Unix.
- Unix seconds = CoreDataTimestamp + 978307200
- Exemplo: 721692800 → 1700000000 → 2023-11-14 22:13:20 UTC
- SQLite: datetime(ZDATE + 978307200, "unixepoch")
- Inverso: CoreDataTimestamp = Unix seconds − 978307200
Consultar armazenamentos SQLite do Core Data
Ler um banco de dados do Core Data diretamente é comum em perícia e depuração. Como os valores são baseados em 2001, um deslocamento esquecido empurra cada data ~31 anos para o passado. Valores negativos são válidos e representam datas anteriores a 2001.
- Os nomes das colunas costumam ter o prefixo Z (a nomenclatura interna do Core Data)
- Um valor 0 significa 2001-01-01, frequentemente usado como data padrão/não definida
- Os horários são armazenados em UTC; aplique o fuso de exibição depois
Conversores de formato de marca de tempo relacionados
Lendo o SQLite do Core Data diretamente
Ao inspecionar um armazenamento .sqlite do Core Data sem o framework:
- Tabelas de entidade têm o prefixo Z (ex.: ZUSER); colunas de atributo de data recebem um prefixo adicional no estilo ZDATE
- Valores ZDATE são CFAbsoluteTime em ponto flutuante — some 978307200 para obter uma marca de tempo Unix
- Um NULL ou 0.0 em uma coluna ZDATE significa que a data nunca foi definida (ou foi definida na própria data de referência)
- A tabela Z_PRIMARYKEY mapeia IDs de entidade para IDs de linha, mas não contém datas
- Para legibilidade em consultas: datetime(ZDATE + 978307200, "unixepoch") no SQLite
FAQ
- Qual epoch o Core Data usa?
- O Core Data armazena datas como segundos desde 1º de janeiro de 2001 00:00:00 UTC, a mesma data de referência de CFAbsoluteTime/NSDate.
- Como converto um ZDATE do Core Data em uma data real?
- Some 978.307.200 ao valor para obter uma marca de tempo Unix e depois formate-a — por exemplo, SQLite datetime(ZDATE + 978307200, "unixepoch").
- Por que minhas datas do Core Data estão 31 anos defasadas?
- Você provavelmente tratou o valor baseado em 2001 como uma marca de tempo Unix. Some o deslocamento de 978.307.200 segundos para corrigir.