System.currentTimeMillis的()为int的回报

System.currentTimeMillis的()为int的回报

问题描述:

我开发一个应用程序中,我动态添加视图并使用分配一个唯一的ID,但它返回负值负值:System.currentTimeMillis的()为int的回报

long time = System.currentTimeMillis(); 
view.setId((int)time); 

所以我搜索的谷歌并找到了另一个解决方案,但是它也不起作用。它还返回负值:

Long time = System.currentTimeMillis(); 
view.setId(time.intValue()); 

所以,我怎么能转换通过System.currentTimeMills()回到int安全长期价值?

System.currentTimeMills()返回1505645107314,同时转换为int返回-1888413582

+1

该值不适用于int。使用很长。 – algrid

+0

感谢您的快速响应,但view.setId()方法需要int值和唯一 –

将大的long值转换为int时,值将会更改。您可能希望将时间除以1000,以秒为单位获得时间,或者从1天前的时间中减去该值(取决于您喜欢的唯一性),并将其用作视图的ID。

view.setId((int)(time/1000)); //this gives unique id for every second. 

编辑 使用下面的代码来获得唯一的ID为每毫秒:

Calendar calendar = Calendar.getInstance(); 
calendar.add(Calendar.DATE, -1); 
long yesterday = calendar.getTimeInMillis(); 
int uniqueId = (int) (yesterday - System.currentTimeMillis()); 
+0

除以1000的作品,但它是稳定的吗?我的意思是我希望这个代码..将来会产生像获得负值的问题吗? –

+0

@jayeshgurudayalani检查已编辑的答案以获得更精确的结果。 –

你不能做到这一点。你为什么使用时间作为唯一的ID?糟糕的做法。

例如,2147483648将被表示为-2147483648。对于小值,铸造是不够的:

long l = 42; 
int i = (int) l; 

然而,long可以比int存储更多的信息,所以它不可能完美地转换从longint,在一般情况下。

您可以使用整数限制内的哈希值作为唯一的ID。

currentTimeMillis返回一个long,有时可能不适合int。因此,我认为你不应该使用这种方法来为视图设置唯一的int ID。

如果你想为你们每一个人创建视图的唯一int,试试这个方法,创建静态反啄:

static int nextViewID = 0; 

当您创建一个新的视图,你只是

view.setId(nextViewID); 
nextViewID++; 

如果你想随机唯一的整数,你可以做这样的事情:

  • 创建静态Set
  • 生成使用java.util.Random
  • 尝试将号码添加到组的随机整数
  • 保持生成另一个整数,直到你成功添加的数量设定

这是正常。在某些情况下,从大数据类型(如long)转换为较小的数据类型(如int)可能会导致值的更改。您可以通过除以某个预设常数(比如10,000)来设计其他方法。例如:

Long t = System.currentTimeMillis()/10000; 
view.setId((int) t); 

这肯定会给你一个正面的价值!