我正在使用Core Bluetooth写入外围设备。我想将当前的unix时间戳发送给传感器,并且我尝试这样做:
// 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:×tamp length:sizeof(timestamp)]; // <- Troublemaker
[pairedPeripheral writeValue:timestampData forCharacteristic:currentCharacteristic type:CBCharacteristicWriteWithResponse];
这是问题所在:
我的32位时间戳返回正确的值,但是当我将其转换为NSData时,外设将其读取为24小时制时钟值,如下所示:“ 16:42:96”
我在哪里出错?
编辑
我修改了代码以摆脱NSDateFormatter,因为有人提到这是不必要的。我似乎仍然得到相同的结果:
// Write timestamp to paired peripheral
NSDate* measureTime = [NSDate date];
uint64_t timestamp = [measureTime timeIntervalSince1970];
NSData *timestampData = [NSData dataWithBytes:×tamp length:sizeof(timestamp)]; // <- Troublemaker
[pairedPeripheral writeValue:timestampData forCharacteristic:currentCharacteristic type:CBCharacteristicWriteWithResponse];
最佳答案
你很困惑。您要发送到外围设备的时间是自1970年以来的整数秒。这是发送Unix时间戳的合理方式,但它不是24小时格式的时间,而是整数。
您将需要更改代码以使用uint64_t或uint32_t,因为Unix时间戳的数字远远大于32位整数的数字。 (我建议使用uint64_t。)
(请参阅@DonMag的注释以获取示例时间戳值,例如1491580283)
外设收到时间后如何显示时间是一个单独的问题,也是您真正应该问的问题。
请注意,如果外围设备的“字节序”与您的iOS设备不同,则可能会以二进制数据形式发送int。您可能希望将时间戳整数转换为字符串,然后发送该字符串以避免字节序问题。
关于ios - 如何将unix时间戳转换为NSData对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43281780/