I am using a Bluetooth device data capture project, in that, I have noticed that I am receiving data from Bluetooth devices in the below format
[11, 6, 0, 231, 7, 1, 26, 11, 46, 45, 79, 1, 133, 176, 248, 0, 0]
This have more reference to the field details
Field1: Flags (8bits)
Field2: Sequence number (16bits)
Field3: Date Time (54 bits)
Field4: Time offset (16 bits)
Field5: Units kg/L: (16 bits SFLOAT)
Field6: Units mol/L: (16 bits SFLOAT): NOT PRESENT
Field7: Type: (4bits):
Field8: Location: (4bit)
Field9: Status: (16bit)
By using the below code I am creating the UTC time
// First construct the UTC date from the base time
let calendar = Calendar.current
var components = DateComponents()
components.day = newMeasurement[6]
components.month = newMeasurement[5]
components.year = ((newMeasurement[4] << 8) | newMeasurement[3])
components.hour = newMeasurement[7]
components.minute = newMeasurement[8]
components.second = newMeasurement[9]
components.timeZone = TimeZone(identifier: "UTC")
let UTCRecord = calendar.date(from: components)
UTC time value looks like 2023-01-26 11:46:45 +0000 and the time offset value in seconds: 20100 and when I convert that into string format I will get: 2023-01-26 17:16:45
Here time shows 17:16:45, but the actual time on the device is 17:21:45
This is how i convert UTCRecord in date format to string format
let dateString = DateFormatter.localizedString(
from: UTCRecord,
dateStyle: .long,
timeStyle: .medium)`
I really don't have any idea about how this time got wrong.
The calculations are correct. You just need to make use of offset value. Offset is telling us the timeZone of current user. Here is the code sample:
func convertDate() {
let gmtTimeString = "2023-01-24 13:40:00" // date string you get from device
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
formatter.timeZone = TimeZone(identifier: "UTC")
guard let date = formatter.date(from: gmtTimeString) else {
print("can't convert time string")
return
}
let userTimeZone = NSTimeZone.init(forSecondsFromGMT: 20100) //20100 is offset
formatter.timeZone = userTimeZone as TimeZone
let localTimeString = formatter.string(from: date)
print("date Now: \(localTimeString)")
}