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

Java 以毫秒为单位理解位和时间,java,epoch,milliseconds,Java,Epoch,Milliseconds,我在读一页,上面说41位用一个自定义的纪元表示41年 我无法理解以毫秒、位和年为单位的时间之间的关系。有人能帮忙吗 例如,在Java中,System.currentTimeMillis返回一个长字符,即64位。这是否意味着如果我必须每毫秒生成1,它可以代表64年的唯一值 在上述情况下,41年后会发生什么?如果它们保持相同的方法,它们是否必须增加用于指定的位 例如,在Java中,System.timeinmillis返回一个长字符,即64位。这是否意味着如果我必须每毫秒生成1,它可以代表64年的唯

我在读一页,上面说41位用一个自定义的纪元表示41年

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

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

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

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

不,远不止这些。不要忘记,对于存储中添加的每一位,您可以存储两倍的值

2^64是18446744073709551616。这就是64位整数数据类型中可以保存的不同值的数量

以毫秒精度计算,这是:

18446744073709551616毫秒 18446744073709551秒 307445734561825分钟 5124095576030小时 213503982334天 584542046年
时间的标准纪元是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位长来表示自历元以来的毫秒数。这就剩下了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次抛硬币交流了

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

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

00 - hearts
01 - clubs
10 - spades
11 - diamonds
所以,如果我进入房间,我看到左边的灯开关是向下的,右边的灯开关是向上的,我可以说:你画了一个梅花!那就对了

您添加的每个灯开关都会使您可以通信的状态数增加一倍。因此,1个光开关有助于区分2件事,例如,2个开关可以做4件事,3个开关可以做8件事,4个开关可以做16件事,等等

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

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

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

除以1000秒。 除以60分钟。 除以60等于小时。 除以24等于天。 除以365.25年。 那我们就这么做吧。2199023255552/1000/60/60/24/365.25=69.682842027

换句话说,有了41个电灯开关,你就可以用毫秒级的粒度与我及时交流,只要我们提前安排好,我们知道我们只在特定的时间范围内交流,而这个时间范围不能超过69年半

做出这样安排的最简单方法是d E将某个时间点视为“历元”——0值

例如,我们可以进行这种预先安排:

让我们宣布UTC时区,新年,1999年成为2000年,这一瞬间,我们称之为0。那么这个数字代表了多少毫秒之后。 因此,数字60000对UTC时区的时间瞬间进行编码,在UTC时区,时间为2000年午夜后1分钟2000-01-01 00:01:00

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

我们的41位将我们带到2069-07-01或2069年7月左右,然后我们的位将耗尽。如果你只是盲目地继续数数,那么,电脑会自动循环,然后你会再次得到数字0,我们会错误地将其理解为:2000年午夜的Juuust

换句话说,它是69岁多一点,41岁只是完全的马粪。我不知道他们为什么写41。但是,41至少接近69,所以可能过于简单化了

当他们达到2041年,或者在他们自己的文档2069中修复错误时会发生什么?嗯,一个简单的解决办法,比如再买10年,就是颁布法令,将0解读为2069年8月,而不是2000年,这没关系,因为instagram还不存在。但这只会让你多活几年


然后,要么真的很老的instagram帖子突然看起来像是从2080年开始的,通过向上重新定义69位加1位的窗口,任何不在窗口中的时间戳看起来都像是,因此是完全错误的,要么他们更改了ID系统,例如添加了其他一些位。他们添加的每一位都会使窗口大小加倍。即使是一点点也足够再过69年了。

旁注:你可能是说?没有关系,那篇博文只是巧合。这只是数学。X位可以表示从0到某个数字的范围,如果你说这个数字是毫秒,那么就做数学运算,看看这是多少年。我投票结束这个问题,因为这只是一个数学问题。谢谢!是的,这正是我完全不喜欢的地方。@WJS:那个插入语是上次尝试时留下的。现在删除:谢谢!这就是我想知道的,为什么他们把41位映射到41年,而41位可以代表很多年@rtwitserloot的回答说明了这一点!知道了!!谢谢你写了这么详细的答案,非常感谢!顺便说一句,对于0000…00110,你们是说照片是在午夜后6毫秒拍摄的,而不是你们写的几秒钟?