微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

以毫秒为单位理解位和时间

如何解决以毫秒为单位理解位和时间

我正在阅读 this 页,其中说 41 位用于使用自定义纪元表示 41 年。

我无法理解以毫秒、位和年为单位的时间之间的关系。有人可以帮忙吗?

例如。在 Java 中,System.currentTimeMillis() 返回一个 long,即 64 bits。这是否意味着如果我必须每毫秒生成 1 个值,它可以代表 64 年的唯一值?

在上述情况下,41 年后会发生什么?如果他们保持相同的方法,他们是否必须增加用于指定的位?

解决方法

例如。在 Java 中,System.timeinmillis() 返回一个 long,它是 64 位。这是否意味着如果我必须每毫秒生成 1 个值,它可以代表 64 年的唯一值?

不,远不止这些。不要忘记,您在存储中每增加一点,就可以存储两倍的值。

2^64 是 18,446,744,073,709,551,616。这就是 64 位整数数据类型中可以保存的不同值的数量。

因此以毫秒精度计算:

  • 18,616 毫秒
  • 18,551 秒
  • 307,445,734,561,825 分钟
  • 5,124,095,576,030 小时
  • 213,503,982,334 天
  • 584,542,046 年

也称为“可能比您需要的范围更大”:)

,

时间的标准纪元是 1970 年 1 月 1 日。

long v = LocalDate.now().getLong(ChronoField.EPOCH_DAY);
long millis = v*24*3600*1_000L; // total possible milliseconds
System.out.println(Long.toBinaryString(millis).length()); // length = 41

因此需要 41 位的 long 来表示自 Epoch 以来的毫秒数。剩下 23 位,这将是很多年(严重轻描淡写)。

,

没有。从 41 位到 41 年并不意味着 64 位将产生 64 年。起初:这不是真的。 2^41/1000/60/60/24/365.24 评估为几乎 70 年,而不是 41。第二:如果 41 位是 41 年,那么 42 位将是 82 年,43 位将是 164 年。明白重点了吗?每一个新位都会使结果加倍。因此,64 位足以使用数百万年。

,

这是一个奇怪的巧合,加上一种奇怪的写作方式。 41 位实际上可以让您获得 69 年,而不是 41 年。本文档的作者搞砸了或过于简化了,但请注意,纯属巧合,69 位与 41 位非常接近。

让我们深入研究一下我们所知道的:

他们明确指出这是某种“毫秒”值。我们也知道它是 41 位,其余的,好吧,剩下的我们将不得不猜测。

让我们研究我们知道的东西:41 位和“毫秒”。

41 位就像 41 个独立的电灯开关。想象一下以下游戏:

你可以进入一个房间。它里面有 1 个电灯开关,没有其他值得注意的地方。除了电灯开关之外,您不能留下任何东西,不能在墙上划伤或以其他方式与这个房间互动。那么,你得走了。然后我稍后进入。

我们可以交流多少信息?

通过一个灯开关,只有 1 位信息:您可以打开或关闭灯,这就是我所知道的。如果你需要与我交流的只是你观察到的硬币翻转的结果而我没有,那么我们只需要 1 位。我们事先做了一个安排:灯朝下代表硬币落反面,灯开起来代表朝头朝上。瞧,我们现在可以交流 1 次抛硬币了。

假设有 2 个电灯开关。你现在可以交流 4 种不同的东西。假设有人从一副牌中抽了一张牌,你看到了,而我没有:如果我们安排了一个“代码”,你可以把这套牌告诉我。

将“关灯”视为 0,将“开灯”视为 1,然后我们可以预先安排此代码:

00 - hearts
01 - clubs
10 - spades
11 - diamonds

所以,如果我进入房间,我看到左边的灯开关关闭,右边的开关打开,我可以说:你抽了一根棍子!没错。

您添加的每个灯开关都会使您可以交流的状态数量增加一倍。因此,1 个灯开关可以区分 2 件事(例如硬币翻转),2 个开关可以做 4 件事,3 个开关可以做 8 件事,4 个开关可以做 16 件事,等等。

这里有 41 个电灯开关。这有助于区分 2^41 或 2,199,023,255,552 不同的唯一值。通过简单的数学。

我们也知道这是区分“毫秒”。让我们将其理解为:这种机制能够以 1 毫秒的粒度存储时间。换句话说,只要这两个时间点相差至少 1 毫秒,它就可以分辨出任何 2 个时间点。

让我们稍微研究一下毫秒:

  • 除以 1000 秒。
  • 除以 60 分钟。
  • 小时数除以 60。
  • 除以 24 天。
  • 多年除以 365.25。

所以让我们这样做。 2,552/1000/60/60/24/365.25 = 69.682842027。

换句话说,通过 41 个电灯开关,您可以以毫秒级的粒度与我及时沟通,只要我们提前安排好我们知道我们只沟通特定时间范围,并且该范围不能超过 69 和半年。

进行这种安排的最简单方法是将某个时间点定为“纪元”——0 值。

例如,我们可以这样预先安排:

  • 让我们规定 UTC 时区,新年的 1999 年变成了 2000 年,在那个瞬间,我们称其为 0。那么这个数字代表许多毫秒之后。

因此,数字 60000 编码了(在 UTC 时区)时间为 2000-01-01 00:01:00(UTC 时区 2000 年午夜后 1 分钟)的时刻。

换句话说,我进入房间,我注意到除了右数第二个和第三个之外,所有的电灯开关都关闭了:0000...00110。我们事先安排好它是通常的二进制计数机制,所以是 6。因此,我知道你想告诉我这张照片是在 2000 年午夜后 6 秒拍摄的,UTC 区域。

我们的 41 位让我们到达 2069-07-01 左右(2069 年 7 月),然后我们用完所有位。如果您只是盲目地继续计数,那么计算机会环绕,那么您又会得到数字 0,我们会错误地将其读为:Juuust at half,year 2000。

换言之,69岁还有点年头,41岁只是完整的马粪。我不知道他们为什么写了 41。但是,41 至少接近 69,所以这可能过于简单化了。

当他们达到 2041 或修复他们自己的文档中的错误 2069 时会发生什么?嗯,一个简单的解决方案,例如再买 10 年是为了将 0 读为 2069 年八月,而不是 2000 年,这没关系,因为 Instagram 还没有出现。但这只会让你多活几年。

然后,要么真的很老的 Instagram 帖子突然看起来像是从 2080 年开始的(通过重新定义 69 位以上的窗口,任何不在窗口中的时间戳看起来都是这样的,因此是完全错误的),或者他们更改了他们的 ID 系统,例如添加另外几位。他们添加的每一位加倍窗口大小。 1 位也够再过 69 年了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。