2011-09-27 17 views
5

I get get CMDeviceMotion oggetti da CMMotionManager. Una delle proprietà di CMDeviceMotion è timestamp, che viene espressa come NSTimeInterval (double). Ciò consente una precisione di timestamp "sotto millisecondo", in base alla documentazione.NSTimeInterval per unix timestamp

[motionManager startDeviceMotionUpdatesToQueue:motionQueue withHandler:^(CMDeviceMotion *motion, NSError *error) { 
    NSLog(@"Sample: %d Timestamp: %f ",counter, motion.timestamp); 
} 

Sfortunatamente, NSTimeInterval viene calcolato dall'ultimo avvio del dispositivo, ponendo sfide significative per utilizzarlo nella sua forma originale.

Qualcuno ha un codice funzionante per convertire questo NSTimeInterval in un timestamp simile a Unix (fuso orario UTC)?

Grazie!

+0

'NSTimeInterval' è in genere relativo alla data di riferimento. Dove si ottiene che questo è relativo dall'ultimo avvio del dispositivo? –

+0

LOL in "sub millisecondo". 'NSTimeInterval' è un' double' con 53 bit di precisione, con una risoluzione di almeno 1/2^52 * (tempo dall'1/01/01). Questo attualmente arriva a circa 80 nanosecondi. Non solo non hanno ottenuto * alcuna * precisione, come direbbe un minuto con un calcolatore portatile, ma ora è impossibile calibrare in modo affidabile i timestamp con qualsiasi altra cosa con una precisione di 10 millisecondi. Inoltre, sospetto che le misurazioni siano prese al tempo libero del chip del sensore, mentre le marcature temporali riflettono quando il kernel ha avuto il controllo sull'elaborazione dei dati. Che casino. – Potatoswatter

risposta

14

Ho avuto un problema simile quando si confrontano i valori del magnetometro con gli eventi CoreMotion. Se vuoi trasformare questi NSTimeIntervals devi calcolare l'offset una volta:

// during initialisation 

// Get NSTimeInterval of uptime i.e. the delta: now - bootTime 
NSTimeInterval uptime = [NSProcessInfo processInfo].systemUptime; 

// Now since 1970 
NSTimeInterval nowTimeIntervalSince1970 = [[NSDate date] timeIntervalSince1970]; 

// Voila our offset 
self.offset = nowTimeIntervalSince1970 - uptime; 
1

Immagino che dovrebbe essere usato come una misura relativa per consentire la sequenza di eventi di movimento in modo corretto, quindi sono stati fatti per un'implementazione il più leggera possibile.

Non riesco a pensare al motivo per cui è necessario disporre della data e dell'ora effettive di un evento di movimento poiché vengono gestite praticamente immediatamente. Ma se lo volessi davvero, dovresti ottenere il timestamp di un evento, usarlo con la data corrente per calcolare la data base e poi usare la tua data base per ricavare il tempo reale degli eventi successivi.

+0

Avevo paura in quanto tale. Speravo di tracciare gli eventi di movimento in un secondo momento, consentendo agli utenti di confrontare gli eventi di movimento (app di Actigraphy). Questo significa molto più matematica da parte mia :( –

+1

Non troppo. La data di NSDateByAddingTimeInterval farà la maggior parte di ciò per te. – jrturton