如何在Android中获取准确的UTC时间戳

时间:2019-07-26 09:21:04

标签: java android unix-timestamp

我不知道哪一个适合获取UTC时间

我的代码是

//header.type = 1, 2 or 3
data_type = get_data_type(header.type);
data_type data = static_cast<data_type>((char*)str.c_str());;

对于Java android

结果是否正确?

也许用户可以更改设备时间并且结果有所不同? (这会影响UTC吗?)

2 个答案:

答案 0 :(得分:0)

在Linux平台上,系统时钟应设置为UTC。究竟是真的还是准确性,最终取决于用户。

呼叫System.currentTimeMillis()将以自1970-01-01T00:00:00Z开始的UTC时间。

  

结果是否正确?

是的。前提是时钟与良好的网络时间源同步,并且用户没有弄乱它。

  

也许用户可以更改设备时间并且结果有所不同?

是的,他们可以。您对此无能为力。

您可以尝试连接到网络时间服务器,但是用户可以阻止它,或者导致您的游戏连接到假时间服务器。如果他们“拥有”您的游戏运行平台,那么您可能将无法获得可靠的时间。

NTP上的Wikipedia页面讨论了中间人攻击。不幸的是,标准NTP无法解决该问题。网络时间draft RFC安全性,但他们自2015年以来一直在努力,但在撰写本文时仍未结束。)

答案 1 :(得分:0)

关于获得正确的“本地”或“国际”时间存在普遍的误解。时间本身并没有意识到这些概念,由于其他人仍在搜索它,因此我将在此处进行解释。

请注意以下情况,假设机器时钟的计数时间正确,并且启动时的初始时间设置也正确。另外请注意,大多数连接的设备都会不时地将此内部时钟与网络源同步,以使其准确运行。

时间本身是我们无法控制的,它经过了片刻。但是时间表示(秒,小时,天,年,数十年)是人为创造的概念,其目的只是为了更清楚地了解时间的流逝。如果我们片刻讨论时间,您可以想象其中的困惑-“嘿,我要在901400203150的时候去商店,您想加入吗?”

无论如何,时区也是如此,它们是人为创造的概念。我们生活在地球上,靠近太阳和月球,太空中正在发生一些旋转,这使我们认识到更长的时间称为“年”,而较短的时间称为“月”。我们还认识到早晨在某些地方早一些,在其他地方晚一些-因此,我们引入了时间计算和时区,以使地球上的每个人都更容易进行时间跟踪。但是在一万年前,没人知道时区,但是时间在流逝。

因此,请牢记以下原始问题:是的,如果您有兴趣获取绝对的当前时间,该方法将有效

如前所述,没有“国际”或“本地”时间,每个人的时间都是一样的。当指代转换为并以某种时区格式表示的时间值时,我们会使用这些术语。今天,我们有了一个叫做Epoch的东西(对于人类:00:00:00 UTC on 1 January 1970,对于大多数机器:0)-因此,获取“自Epoch以来的毫秒数”将为您提供原始时间,自大纪元以来表示(以毫秒为单位)。

时间本身不知道时区或年或月,这是一种人类构造,您必须自己转换。基本上,从操作系统中获得的是原始时间,然后将其转换为所需的时区,所需的格式和语言,以使用户更容易阅读。以及如何转换时间-这是一个完全不同的问题。 :)