2011-09-27 10 views
5

私はCMDeviceMotionオブジェクトからCMMotionManagerを取得しています。 CMDeviceMotionのプロパティの1つはタイムスタンプで、NSTimeInterval(double)として表されます。これにより、ドキュメンテーションによると、「サブミリ秒」のタイムスタンプ精度が可能になります。NSTimeIntervalからunixタイムスタンプ

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

残念ながら、NSTimeIntervalは、その生の形式でそれを使用する重大な課題を装った、最後のデバイスのブート以降に計算されます。

このNSTimeIntervalをUnixのようなタイムスタンプ(UTCタイムゾーン)に変換する作業コードがありますか?

ありがとうございました!

+0

「NSTimeInterval」は、通常、参照日付を基準にしています。これは最後のデバイスのブートからの相対的なものです。 –

+0

"サブミリ秒"でLOL 'NSTimeInterval'は53ビットの精度を持つ' double'で、少なくとも1/2^52 *(1/1/01からの時間)の分解能を与えます。それは現在約80ナノ秒になる。ハンドヘルド電卓では1分と言わざるを得ないだけでなく、10ミリ秒の精度でもタイムスタンプを確実に較正することは不可能です。さらに、センサチップの余裕度で測定が行われていると思われますが、タイムスタンプはカーネルがデータを処理する時間を反映しています。何が混乱している。 – Potatoswatter

答えて

14

CoreMotionイベントと磁力計の値を比較すると、同様の問題が発生しました。これらのNSTimeIntervalを変換する場合は、オフセットを1回計算するだけで済みます。

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

関連する問題