2017-04-07 14 views
0

私は周辺機器に書き込むためにCore Bluetoothを使用しています。UNIXのタイムスタンプをNSDataオブジェクトに変換するには?

// Write timestamp to paired peripheral 
NSDate*   measureTime = [NSDate date]; 
NSDateFormatter* usDateFormatter = [NSDateFormatter new]; 
NSLocale*   enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; 

[usDateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.000'Z'"]; 
[usDateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; 
[usDateFormatter setLocale:enUSPOSIXLocale]; // Should force 24hr time regardless of settings value 

NSString *dateString = [usDateFormatter stringFromDate:measureTime]; 
NSDate* startTime = [usDateFormatter dateFromString:dateString]; 

uint32_t timestamp = [startTime timeIntervalSince1970]; 
NSData *timestampData = [NSData dataWithBytes:&timestamp length:sizeof(timestamp)]; // <- Troublemaker 
[pairedPeripheral writeValue:timestampData forCharacteristic:currentCharacteristic type:CBCharacteristicWriteWithResponse]; 

ここで問題です:

私の32ビットのタイムスタンプは、正しい値を返します、しかし、ときに私そうようにすることを、私はセンサに現在のUnixタイムスタンプを送りたい、と私はやることを試みてきましたそれをNSDataに変換すると、周辺機器は次のような24時間のクロック値として読み取ります。 "16:42:96"

ここでエラーが生じますか?

EDIT

私は、誰かがそれが不要であることを述べたように、NSDateFormatterを取り除くために、コードを変更しました。私はまだ同じ結果を取得しているようだ:

// Write timestamp to paired peripheral 
NSDate*   measureTime = [NSDate date]; 
uint64_t timestamp = [measureTime timeIntervalSince1970]; 
NSData *timestampData = [NSData dataWithBytes:&timestamp length:sizeof(timestamp)]; // <- Troublemaker 
[pairedPeripheral writeValue:timestampData forCharacteristic:currentCharacteristic type:CBCharacteristicWriteWithResponse]; 
+0

"周辺機器の読み取り"とはどういう意味ですか? 「16:42:96」はどこで取得できますか? – Kreiri

+0

ライトブルーを使用して特性値を読み取ったとき、その数値は「16:42:96」と表示されますが、本当に欲しいのは「149562 ....」というUNIXタイムスタンプです –

答えて

1

あなたは混乱しています。周辺機器に送信するものは、1970年以来の整数秒です。これはUnixのタイムスタンプを送信するための合理的な方法ですが、24時間形式ではなく、整数です。

UNIXのタイムスタンプは32ビット整数よりもはるかに大きいので、コードを変更してuint64_tまたはuint32_tを使用する必要があります。 (私はuint64_tをを使用してお勧めします。)

(1491580283のように、サンプルのタイムスタンプ値のためDonMagさんのコメント@参照)

あなたはそれが周辺で受信されると、別の質問で、質問はそのあなたのその時間を表示する方法

本当に尋ねるべきです。あなたは、周辺にはiOSデバイスとは異なる「エンディアン」を持っている場合は、バイナリデータとしてINTを送るの問題に実行することがあり

注意。エンディアンの問題を回避するために、タイムスタンプ整数を文字列に変換して送ることができます。

+0

それで、あなたは、それを24時間として読む周辺機器は全く別の問題であると言っています。しかし、私の32-64ビット整数をNSDataオブジェクトに変換すると、10進値に変換された16進数値は標準のタイムスタンプ値フォーマットを表しません。 –

+0

@FaisalSyed - "16進値"はどこにありますか? – DonMag

+0

NSDataオブジェクトの説明を印刷すると、次のように表示されます。この16進値を整数に変換すると、正しいタイムスタンプ値が表示されません。 –

0

あなたは、周辺への文字列表現を送信することを計画している場合を除き、NSDateFormatterを使用する必要はありません。 Apple Developer docsから

NSDateオブジェクトは、任意の特定の暦システムやタイムゾーンの独立した時間内の単一のポイントを、カプセル化します。 Dateオブジェクトは不変であり、絶対参照日付(2001年1月1日00:00:00 UTC)に対する不変時間間隔を表します。念頭に置いて

、あなたはそのままmeasureTimeを使用して、同じ結果を得ることができます。周辺についての詳細を知らなくても

uint32_t timestamp = [measureTime timeIntervalSince1970]; 

を、それがなぜそれが24時間営業を見せていると言うことは不可能です値。

もし私が推測の危険を冒すならば、それを別のフォーマットに切り替えるために、最初に修正する必要がある別の特性/価値があると思います。

+0

私は同じ結果 - タイムスタンプは正しいですが、私がNSDataオブジェクトに渡したときの結果はです。これは16進数 - > 10進数を変換すると間違ったUnixタイムスタンプです。 –

+0

@FaisalSyed - 1970年以降の秒数をBluetoothデバイスに送信しています。その時点では、フォーマットやタイムスタンプとは関係ありません。それは単なる数字です。たとえば、今あなたのコードを実行すると、 'timestamp'の値は1491580283です。あなたのBluetoothデバイスがそれをどのように表示するか(または他のBluetoothリーダーがそれをどのように表示するか)は、あなたがしていることと全く無関係です。 – DonMag

関連する問題