2011-09-27 135 views
5

我得到CMDeviceMotion對象從CMMotionManager。 CMDeviceMotion的其中一個屬性是時間戳,它表示爲NSTimeInterval(double)。根據文檔,這允許「亞毫秒」時間戳精度。NSTimeInterval到unix時間戳

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

不幸的是,NSTimeInterval是自去年設備啓動計算,冒充顯著挑戰原始形式使用它。

有沒有人有工作代碼將此NSTimeInterval轉換爲像時間戳(UTC時區)的Unix?

謝謝!

+0

'NSTimeInterval'通常是相對於參考日期。你從哪裏得到這個相對於最後一次設備啓動? –

+0

LOL在「亞毫秒」。 'NSTimeInterval'是一個具有53位精度的「double」,分辨率至少爲1/2^52 *(自1/1/01以來的時間)。目前約爲80納秒。他們不僅沒有獲得任何*精度,而且手持式計算器在一分鐘內會告訴他們,但現在不可能用其他任何東西,甚至10毫秒精度來可靠地校準時間戳。此外,我懷疑測量是在傳感器芯片的閒置狀態下進行的,而時間戳反映了內核處理數據的時間。真是一團糟。 – Potatoswatter

回答

14

將磁力計值與CoreMotion事件進行比較時,我遇到了類似的問題。如果你想轉換這些NSTimeIntervals,你只需要計算一次偏移量:

// 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

我想它應該被用作相對測量,以便您正確地對運動事件進行排序,所以它們儘可能輕量級地實施。

我想不出爲什麼你需要動作事件的實際日期和時間,因爲它們幾乎都是直接處理的。但是,如果你真的想,你必須得到一個事件的時間戳,用當前日期來計算基準日期,然後用你的基準日期來推導後續事件的實際時間。

+0

我很害怕。我希望稍後繪製動作事件,允許用戶比較動作事件(Actigraphy應用程序)。這意味着更多的數學在我的部分:( –

+1

不太多.NSDate的dateByAddingTimeInterval將爲你做大部分。 – jrturton