0

Java,日期很长的问题。如果我们有:

        String rand = new Long(System.currentTimeMillis()).toString();
        logger.info("full :" + rand);
        rand = rand.substring(rand.length() -9);
        logger.info("Significant 8 :" + rand);

那么有没有办法知道结果是多少天/分钟是唯一的?样本输出:

满:1382519851946

重要8:19851946

我猜最后 3 位数字是毫秒,接下来的两个 51 是秒,那么 98 198 是小时和分钟?

换句话说,如果我取 10 位数字,我会得到一整天的唯一值吗?当然,假设只有一个线程和一个 JVM 正在生成这些。

4

4 回答 4

2

currentTimeMillis实际上是自 1970 年 1 月 1 日以来的毫秒数(来源)。

您可以使用模运算(等等)获得秒、分钟和小时milliseconds % 1000 = seconds,但由于闰秒,结果不会完全准确。有关更多详细信息,请参阅http://docs.oracle.com/javase/6/docs/api/java/util/Date.html中的讨论。

于 2013-10-23T09:25:36.813 回答
2

毫秒是秒的 1/1000。在那里形成很容易:

您可以取3位数并在一整内获得相同的值(1000 英里)

您可以取4位数字并在一分钟内获得相同的值(60000 英里 > 10000)

您可以取6位数字并在一小时内获得相同的值(3600000 英里 > 1000000)

您可以取7位数字并在一整天内获得相同的值(86400000 milis > 10000000)

如果你需要更多的公式从那里很容易。我想这就是你的意思。如果你从前面取数字,每英里你会得到不同的值。如果你想创建一系列唯一值,你可以颠倒我在这里所说的:

要获得第二个唯一值,请留下3位数。(1000 英里)

要为一分钟保留唯一值,请保留5位数字。(60000 英里 < 100000)

要为一小时保留唯一值,请保留7位数字。(3600000 英里 < 10000000)

要拥有一天的唯一值,请保留8位数字。(86400000 英里 < 100000000)

问题不在于你从前面取多少位数(因为长度不同),而是你留下多少位数。

于 2013-10-23T09:26:31.983 回答
0

假设右边的所有 10 位数字都是 9,那么剩下的值会在下一毫秒发生变化。

于 2013-10-23T09:37:22.750 回答
0

除了你的无知(不是我的意思,但你显然甚至没有阅读文档),我特此对准确性有 2 美分:

JVM 对时间准确性没有发言权。纳秒时间和毫秒精度取决于操作系统。例如,如果您在没有特殊库的 Windows 或普通 Linux 下,则 1ms 点之后的所有数字都是 0。但是,特殊的第 3 方库支持微秒和(偶尔)纳秒。

鉴于您的问题的质量,我认为您没有任何理由需要使用纳米,如果是微型的话。

于 2013-10-23T09:55:21.783 回答