Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 设置与System.currentTimeMillis()的时间差_Android_Timestamp_Unix Timestamp_Clock_Dragonboard - Fatal编程技术网

Android 设置与System.currentTimeMillis()的时间差

Android 设置与System.currentTimeMillis()的时间差,android,timestamp,unix-timestamp,clock,dragonboard,Android,Timestamp,Unix Timestamp,Clock,Dragonboard,我发现了问题所在: 很明显,is对输入值的精度进行了假设,从这些假设中,841073068周围的值可以追溯到1996/1997年。我不确定是什么假设导致了那个确切的日期,但老实说,我不在乎 使用附带的调试器,我调用了新日期(System.currentTimeMillis()),它正确地给了我一个1070年1月10日的日期,这意味着时钟不会像疯了一样跳开 原始问题: 我正在运行一台单板电脑,Android for和IoT机箱(这个)。运行的操作系统是高通公司提供的普通安卓系统 目前,我正在测试一

我发现了问题所在:

很明显,is对输入值的精度进行了假设,从这些假设中,
841073068
周围的值可以追溯到1996/1997年。我不确定是什么假设导致了那个确切的日期,但老实说,我不在乎

使用附带的调试器,我调用了
新日期(System.currentTimeMillis())
,它正确地给了我一个1070年1月10日的日期,这意味着时钟不会像疯了一样跳开

原始问题:

我正在运行一台单板电脑,Android for和IoT机箱(这个)。运行的操作系统是高通公司提供的普通安卓系统

目前,我正在测试一次执行很长时间的板的可靠性,我看到一些非常奇怪的行为,我找不到解释

该电路板10天前通电,无法访问互联网(WiFi已打开,但没有接入点设置,也没有以太网)。蓝牙是开着的,办公室里有iBeacons和Eddystone。该地区也有无线网络

如果我现在进入
设置->日期和时间
,或检查通知阴影,或进入时钟应用程序或日历应用程序,我会看到1970年1月10日。这是预期的,基本上显示了董事会运行了多长时间

它上面的应用程序有一个始终运行的服务,它执行一些数据处理和一些磁盘记录(用于调试)

从日志中,我可以看到,当电路板最初通电时,
System.currentTimeMillis()
正在返回预期值。这意味着,日志的开始表明一个纪元时间是1970年1月

但是在日志的末尾(同时在实时进程上附加调试器),
System.currentTimeMillis()
的值在1996年9月/10月的某个地方。示例值:
841073068
841263234
841579239

所以我的问题是:

  • 这里发生了什么
  • 为什么
    System.currentTimeMillis()
    值发生了变化,是什么改变了它
  • 为什么Android用户界面(通知、时钟应用、设置)仍然显示我?他们从哪里得到这个值
编辑:

答案有些混乱,我可以看出我的问题缺少细节

我不想测量时间的差异。我需要一个真正的时间戳。这些值将通过发送到我们的后端与蓝牙LE事件一起报告。这个“无网络”的东西是一个可靠性测试,我们正在板上运行,但我们确实希望大部分时间都有网络,板应该使用正常的Android方式从网络自动更新时间


我只是想了解当前批次测试中出现的问题以及原因。

好吧,正如您已经知道的,当前系统时间(
system.currentTimeMillis()
)可以由任何进程修改,如果需要的话,它完全可能由另一个进程修改。这不是测量时间的可靠方法

我会使用类似于:

SystemClock.uptimeMillis()
设备启动后经过的时间(毫秒)(不包括深度睡眠时间)

我还想提到的是,我怀疑蓝牙与此有关,我可以想象蓝牙使用系统时间进行配对和安全性,就像SSL一样(但我不是专家)。GPS也可能是一个问题,因为GPS可用于获取UTC时间值,但我不确定您的董事会是否有GPS模块

关于您的编辑:


获得一个有效的时间戳是很容易的:服务器时间减去董事会报告的运行时间。但是我建议您要么选择接受
System.currentTimeMillis()
报告的时间,要么使用经过的时间。在我工作的公司,我们也使用嵌入式Android设备,在我们的服务器仪表板上,我们可以看到启动时间(自启动以来)和当前设备时间,但至少在我看来,它们不应该是混合的,特别是因为
System.currentTimeMillis()
可能会发生变化,并且会受到夏季和冬季时间的影响。

如果您想测量某些东西,最好尝试
System.nanoTime()
。区别在于-

奇怪的行为,我经常在系统时间与实时时间相差甚远的软件中发现bug。我个人倾向于避免系统时间到目前为止是关闭的。无论如何,这个问题似乎和这个论坛无关。您可能不想向制造商或谷歌发送错误报告。@Rolfツ 我理解你考虑话题的原因,但我明白,我可能没有考虑到一些编程的原因。正常情况下,我也会消除远距离时钟,但由于这是对连接不稳定时行为的可靠性测试,因此挖掘并了解系统限制非常重要。感谢您的回答,但这不是我真正想要的,请阅读我问题的编辑。Tl;博士是。我真的需要时间戳,这只是目前的一个测试。请参阅问题顶部的编辑,我找到了发生的情况。我也怀疑蓝牙,但我们的过程没有与任何东西配对,只进行蓝牙LE扫描。董事会有GPS,但我们没有用它做任何事情,它在办公室里,我怀疑它能收到任何信号。另外,请检查我的问题的编辑谢谢你的回答/评论。请看问题顶部的编辑,我找到了发生的事情。我们不会将正常运行时间和当前时间混合使用。但只是我们需要在仪表板上报告扫描事件发生的时间,如果电路板重新启动或进入睡眠状态,则无所谓,一般情况下,数据应该通过NTP正常保存在设备上,只是网络故障导致1970年。