AFAIK java以长度变量存储日期,以毫秒为单位.因此有一天将没有价值(因为长期有一个最大值),这将对应于该瞬间的时间.你知道什么时候会发生吗?
在 java 中,无论体系结构是 32 位还是 64 位,是否保证 int 始终为 32 位大小且 long 为 64 位大小?
我使用例如此代码来检查用户是否可以执行某些操作.因此,用户每5秒钟只能执行一次操作.
if((System.currentTimeMillis() - lastTime) > 5000)
{
// Message: Ok, you can do action now.
}else{
// Message: Have to wait 5 seconds to do action.
return;
}
lastTime = System.currentTimeMillis();
Run Code Online (Sandbox Code Playgroud)
但是众所周知,System.currentTimeMillis()
回报很长,而且长期可以继续增长,直到它变成否定为止.
我的代码应该在需要超过1个月正常运行时间的服务器上运行.因此,我担心在某些时候System.currentTimeMillis()
会返回一个否定值,我的代码将始终告诉用户他需要等待5秒或相反.
我真的很难专注于这段代码并修复它,所以我问你们,如果你有一个关于如何解决这个问题并使我的代码100%安全的提示.
2038 年问题(也称为 Y2038 或 Unix Y2K)涉及将许多数字系统中的时间表示为自 1970 年 1 月 1 日 00:00:00 UTC 以来经过的秒数,并将其存储为有符号的 32 位整数。此类实现无法对 2038 年 1 月 19 日 03:14:07 UTC 之后的时间进行编码。就像 Y2K 问题一样,2038 年问题是由所选数据类型的容量不足引起的。
我试图搜索这如何影响 Android 及其应用程序。但我没有找到任何明确的答案。所以我想在这里问:
如果我们的程序将使用 System.currentTimeMillis() 方法,我们是否可以预期未来(2038 年及以后)会出现任何问题?
它们是我们应该避免的任何危险方法吗?
我正在编写一些代码,由于Java 溢出,因此Year_2038_problem会在2038年1月19日之后停止工作,Date
所以我可以创建一个junit测试,该测试在2036年开始失败,给我2年的时间来修复它。
首先要创建一个失败的测试,我又增加了25年的时间,并且对测试没有失败感到惊讶。
@Test
public void warn2038Overflow() {
Calendar c = Calendar.getInstance();
c.add(Calendar.YEAR, 25);
// today is 2019 plus 25 years becomes 2044 which should overflow
assertEquals("No calendar overflow", true,
c.getTimeInMillis() > 0l);
}
Run Code Online (Sandbox Code Playgroud)
有什么线索为什么这不会失败?
我正在将Android-Studio-3.4.1与java-1.8.0_152(64位)结合使用,并具有'junit:junit:4.12'和'androidx.test:runner:1.1.0'
java ×5
year2038 ×2
32bit-64bit ×1
android ×1
datetime ×1
int ×1
junit ×1
long-integer ×1
milliseconds ×1
time ×1