什么时候System.currentTimeMillis()溢出?
我有一个networking应用程序,使用时间戳,这只是一个长期秩序的东西。 我的networking应用程序后端恰好是用java编写的,所以我正在使用:
long timestamp = System.currentTimeMillis();
哪年(大约)会失败? 我的意思是在某个时刻,一个长的范围会溢出,对吧? 我们可能都已经死了,但我只是好奇而已。 它会再次像Y2K一样吗? 我能做些什么准备呢? 可笑,我知道,只是好奇!
谢谢
它会溢出
System.out.println(new Date(Long.MAX_VALUE));
打印
Sun Aug 17 03:12:55 GMT-04:00 292278994
因此,这超过了2.92亿年。 我想说,在此期间有足够的时间来发明解决scheme。 说实话,我不期望人类能够生存下去。 与小时世界的年龄相比,我们只存在几秒钟,而且不会很长。
尝试运行这个代码:
System.out.println(new Date(Long.MAX_VALUE));
打印这样的东西取决于你的区域设置:
Sun Aug 17 17:12:55 EST 292278994
将来很长,所以不必担心溢出。
“我能做些什么准备呢?”
那么,你可以让你的棺材配备最新的和最好的IT装备/怪胎玩具。 但不知何故,我认为他们在公元292,278,994会有点“过时”。 到那时你会觉得很无聊
请注意,您将有足够的时间从头开始重新编写操作系统以使用128位时钟。 这听起来像是一个有趣的项目,以消除时间。 🙂
你的networking应用程序似乎不太可能会在8月17日17:12:55(美国东部时间292278994)(由其他人计算)。 那么,你似乎更不可能仍然负责networking应用程序。 (如果你仍然对此负责,将来可能会以更高的利率获得报酬,所以现在就让它滑下来,然后收集大笔的钱)
系统时钟设置错误的可能性大得多,有些奇怪。 你可以在下面编写这个比较简单的伪代码
long reasonableDate ( ) { long timestamp = System.currentTimeMillis(); assert timestamp after 2010AD : "We developed this web app in 2010. Maybe the clock is off." ; assert timestamp before 10000AD : "We don't anticipate this web app will still be in operation in 10000AD. Maybe the clock is off." ; return ( timestamp ) ; }
如果任何一个断言被触发时你还活着,那么你可能会向你的客户收取大笔费用,以固定系统时钟或更改断言(如适用)。
一个Java long
的最大值是2^63 - 1
,如果把这个毫秒转换成实际的时间单位,你会发现这个计数器会在大约2.9亿年内溢出。 所以不要担心;如果有人还在运行计算机,那么我肯定他们已经切换到128位时间计数器了(或者select了一个新纪元)。
这些答案中的错误是假设你正在运行的系统是64位,并且自1970年以来返回一个64位的millis表示.Linux使用32位表示,溢出在2038年。
见2038年的问题作为参考