Как iPhone SDK Core Data system хранит типы даты к sqlite?

Я использовал базовые данные, чтобы сделать это:

NSManagedObjectContext *m = [self managedObjectContext];
Foo *f = (Foo *)[NSEntityDescription insertNewObjectForEntityForName:@"Foo" 
                                                        inManagedObjectContext:m];
f.created_at = [NSDate date];
[m insertObject:f];

NSError *error;
[m save:&error];

Где created_at поле определяется как тип "Дата" в xcdatamodel.

Когда я экспортирую sql из sqlite базы данных, это создало, created_at определяется как тип "метка времени", и значения похожи:

290902422.72624

Девять цифр перед. и затем некоторая часть.

Каков этот формат? Это не время эпохи, и это не julianday формат.

Эпоха была бы:

1269280338.81213

julianday был бы:

2455278.236746875 (замечают только 7 цифр перед. не 9 как я имею),

Как я могу преобразовать число как 290 902 422,72624 ко времени эпохи?Спасибо!

12
задан Tim 22 March 2010 в 18:08
поделиться

2 ответа

Во-первых, обратите внимание, что в документации Core Data говорится, что вы никогда не должны самостоятельно трогать SQL или значения, которые он генерирует - это может привести к недействительности вашей модели, если вы внесете в нее изменения, и это трудно разобрать в первую очередь.

Учитывая это, возможно, вы видите даты относительно 1 января 2001 года по Гринвичу. В документации к NSDate указано, что единственный примитивный метод, timeIntervalSinceReferenceDate, использует это время для своей ссылки. Core Data, в свою очередь, использует NSDateAttributeType для хранения типов дат, который определен как объект NSDate.

Прогнав значение через калькулятор, вы получите:

290902422.72624 / 60 / 60 / 24 / 365.25 = 9.21814...

что примерно равно количеству лет, прошедших с этой контрольной даты.

Если вам действительно нужно разобрать это значение обратно в эпохальное время, вы можете использовать метод initWithTimeIntervalSinceReferenceDate: с вашим числом, сохраненным в SQLite, чтобы получить NSDate, затем вызвать timeIntervalSince1970, чтобы получить эпохальные секунды обратно (в NSTimeInterval struct).

25
ответ дан 2 December 2019 в 03:32
поделиться

Я столкнулся с проблемой, связанной с попыткой сравнить хранимую в Core Data дату с хранимой в MySQL датой в удаленном API. Моим решением было использование функций даты SQLite для преобразования времени:

SELECT datetime('2001-01-01','+290902422.72624 second');

Возврат:

2010-03-21 22:13:42

SQLite предполагает, что дата указана в местном времени и преобразует ее в UTC/GMT. Если вы хотите, чтобы она оставалась в местном времени, используйте модификатор местного времени:

SELECT datetime('2001-01-01','+296662599 second','localtime');

Returns:

2010-03-21 17:13:42

Это показывает смещение -0500 для моей местной TZ.

Основываясь на этом, вы можете использовать функцию strftime в SQLite с форматом '%s' для получения времени эпохи:

SELECT strftime('%s',datetime('2001-01-01','+290902422.72624 second'));

Returns:

1269209622

Надеюсь, это поможет.

9
ответ дан 2 December 2019 в 03:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: