【问题标题】:System.currentTimeMillis() to int returns negative valueSystem.currentTimeMillis() 到 int 返回负值
【发布时间】:2017-09-17 10:56:40
【问题描述】:

我正在开发一个应用程序,我在其中动态添加视图并使用分配唯一 ID,但它返回负值:

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

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

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

那么如何安全地将System.currentTimeMills() 返回的长值转换为int

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

【问题讨论】:

  • 该值不适合 int。使用长。
  • 感谢您的快速响应,但 view.setId() 方法需要 int 值和唯一性

标签: java android type-conversion


【解决方案1】:

当一个大的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());

【讨论】:

  • 除以 1000 可行,但它稳定吗?我的意思是我希望用这段代码.. 以后不会产生像得到负值这样的问题?
  • @jayeshgurudayalani 检查编辑后的答案以获得更精确的结果。
【解决方案2】:

currentTimeMillis 返回一个 long,它有时不适合 int。因此,我认为您不应该使用它来为视图设置唯一的int id。

如果您想为您创建的每个视图创建一个唯一的int,请尝试这种方法,创建一个静态计数器:

static int nextViewID = 0;

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

view.setId(nextViewID);
nextViewID++;

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

  • 创建静态Set
  • 使用java.util.Random生成一个随机整数
  • 尝试将数字添加到集合中
  • 继续生成另一个整数,直到您成功将数字添加到集合中

【讨论】:

    【解决方案3】:

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

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

    这肯定会给你一个积极的价值!

    【讨论】:

      【解决方案4】:

      你做不到。为什么使用时间作为唯一标识?不好的方法。

      例如,2147483648 将表示为 -2147483648。对于较小的值,强制转换就足够了:

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

      但是,long 可以比int 保存更多信息,因此在一般情况下,不可能完美地从long 转换为int

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-02
        • 2018-05-07
        • 2015-09-27
        • 2013-06-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多