Python 如何在Garmin设备中处理时间戳_16?

Python 如何在Garmin设备中处理时间戳_16?,python,datetime,timestamp,bit-manipulation,garmin,Python,Datetime,Timestamp,Bit Manipulation,Garmin,我拥有一个Garmin Vivosport,用于跟踪我的活动和睡眠,我想对通过Garmin Connect下载的FIT文件中的心率数据进行分析 问题是我无法正确对齐时间戳 有人问了一个类似的问题,但我没有找到答案,也无法评论添加我的问题 如前所述,在FIT文件中,时间戳信息分为两个不同的变量:一个是不时出现的时间戳,另一个是附加到每个单独测量的时间戳_16。根据他们的说法,timestamp\u 16包含实际时间戳的低16位,因此它应该与前一个timestamp的高16位组合 我正在使用2019

我拥有一个Garmin Vivosport,用于跟踪我的活动和睡眠,我想对通过Garmin Connect下载的FIT文件中的心率数据进行分析

问题是我无法正确对齐时间戳

有人问了一个类似的问题,但我没有找到答案,也无法评论添加我的问题

如前所述,在FIT文件中,时间戳信息分为两个不同的变量:一个是不时出现的
时间戳
,另一个是附加到每个单独测量的
时间戳_16
。根据他们的说法,
timestamp\u 16
包含实际时间戳的低16位,因此它应该与前一个
timestamp
的高16位组合

我正在使用2019年5月1日记录的数据。文件覆盖了一天中的24小时,所以第一个数据点是00:00(我在Garmin Connect和things match的图形界面中检查了这一点)。在此文件中,我发现这是第一个感兴趣的数据条目:

monitoring
 * activity_type: sedentary
 * current_activity_type_intensity: (8,)
 * intensity: 0
 * timestamp: 2019-04-30 22:00:00

[some other lines in between]

monitoring
 * heart_rate: 72
 * timestamp_16: 31132
上面截取的第一个
监控对象是包含心率的对象之前包含
时间戳的最后一个对象,因此它与链接指令中写入的内容相匹配

有了这些信息,我尝试了一些解决方案,但没有一个解决方案,我成功地将文件中第一个数据点的实际时间戳设置为2019年5月1日00:00(也不是几分钟内)

如果我按照上面链接中给出的说明进行操作,我会得到:

mesgTimestamp = timestamp
mesgTimestamp += ( timestamp_16 - ( mesgTimestamp & 0xFFFF ) ) & 0xFFFF
但结果是:
2019-05-01 12:49:00

我还试图手动将
时间戳
的较低16位替换为
时间戳(u 16
),但同样没有成功:

timestamp    :   0b1011100110010001011111001011000
timestamp_16 :                   0b111100110011100
result       :   0b1011100110010000111100110011100
与上述
结果相对应的
datetime
值是
datetime.datetime(2019,4,30,18,36,44)

是我所有尝试的代码。 这是一个正在讨论的github问题

如上所示,我无法得到正确的结果,即2019年5月1日00:00。除此之外,如果我在比特级别手工应用Garmin的配方,我得到的结果与应用他们给出的公式得到的结果不同

另外,我得到的结果在一定时间内是非零分秒的,这让我相信这不是时区问题(我也尝试过玩它,但没有成功)

有人找到了稳定的解决方案吗?如果你有,你能分享一些东西吗(还有其他语言,我对这里的逻辑感兴趣)


几个月以来,我一直在努力做到这一点(在业余时间做这项工作),但这种结果的缺乏确实令人沮丧:\

考虑到特殊的Garmin纪元,它比Unix时间戳纪元晚631065600秒,计算需要在那个特殊的时间进行(如果只是一个正常的偏移量,情况就不一样了,但这些偏移量并不是严格相加的,所以时间的“绝对值”很重要)。只需减去631065600:

dt_offset = datetime.datetime(2019,4,30,22,0,0,0)
timestamp = int(datetime.datetime.timestamp(dt_offset)) - 631065600
timestamp_16 = 31132
以任何合理的方式应用时间增量,例如:

mesgTimestamp = timestamp
mesgTimestamp += ( timestamp_16 - ( mesgTimestamp & 0xFFFF ) ) & 0xFFFF
或:

或:


结果:
New:2019-05-01 00:01:00+02:00
足够近了吗?

只是一个想法,时区是否应用于日期?在带有日期时间的浏览器中工作让我很沮丧,因为它总是喜欢在写入控制台时添加您的本地时区,以及字符串日期。@Gauthier,正如我提到的,我试图在测试中包括时区,但是它没有带来任何改善。另一方面,5小时23分16秒的差异与任何时区差异都不匹配我猜是的,这就是诀窍!我开始怀疑Garmin偏移量应用于32位时间戳,而不是16位时间戳,当我尝试这样做时,我发现了诀窍:)是否有人已经习惯了R和Python,并可以解释如何在R中实现它?特别是:mesgTimestamp=timestamp+((timestamp_16-timestamp)&0xffff)
mesgTimestamp = timestamp + ((timestamp_16 - timestamp) & 0xffff)
mesgTimestamp = (timestamp & 0xffff0000) | timestamp_16
if mesgTimestamp < timestamp:
  mesgTimestamp += 0x10000
print('New:', datetime.datetime.fromtimestamp(mesgTimestamp + 631065600, pytz.timezone('Europe/Zurich')))