Я использовал базовые данные, чтобы сделать это:
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 ко времени эпохи?Спасибо!
Во-первых, обратите внимание, что в документации 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).
Я столкнулся с проблемой, связанной с попыткой сравнить хранимую в 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
Надеюсь, это поможет.