为每次迭代生成不同的日期

时间:2017-10-30 14:04:48

标签: java

这里需要在for循环的每次迭代中为Date生成不同的值。

使用currentTimeMillis没有帮助,因为它给出了相同的时间,但nanoTime完全给出了错误的日期。

    for (int i = 0; i < 10; i++) {
        System.out.println(new Date(System.currentTimeMillis()));
    }

    for (int i = 0; i < 10; i++) {
        System.out.println(new Date(System.nanoTime()));
    }
Mon Oct 30 19:33:43 IST 2017
Mon Oct 30 19:33:43 IST 2017
Mon Oct 30 19:33:43 IST 2017
Mon Oct 30 19:33:43 IST 2017
Mon Oct 30 19:33:43 IST 2017
Mon Oct 30 19:33:43 IST 2017
Mon Oct 30 19:33:43 IST 2017
Mon Oct 30 19:33:43 IST 2017
Mon Oct 30 19:33:43 IST 2017
Mon Oct 30 19:33:43 IST 2017
Tue Feb 09 09:56:54 IST 2292
Tue Feb 09 09:57:39 IST 2292
Tue Feb 09 09:58:10 IST 2292
Tue Feb 09 09:58:50 IST 2292
Tue Feb 09 09:59:24 IST 2292
Tue Feb 09 09:59:53 IST 2292
Tue Feb 09 10:00:29 IST 2292
Tue Feb 09 10:00:59 IST 2292
Tue Feb 09 10:01:37 IST 2292
Tue Feb 09 10:02:18 IST 2292

UPDATE :需要为每次迭代生成不同的时间戳,就像在cassandra数据库中那样,其中不同的记录需要具有唯一的时间戳。否则他们会互相覆盖。时间也不应该是假的,因为在for循环中添加第二个会解决问题但是假时间。遗憾的是,添加睡眠不是一个选项,因为代码需要尽快添加记录并退出

4 个答案:

答案 0 :(得分:4)

首先请注意,nano提供的值超过毫米,并且您传递纳秒值代替毫秒,因此结果奇怪。

Date(long date)构造函数期待什么

  

date - 自1970年1月1日00:00:00 GMT以来的毫秒数。

nanoTime返回什么

  

返回正在运行的Java虚拟机的高分辨率时间源的当前值,以纳秒为单位。

nanoTime与Date()完全无关。它旨在解决不同的目的。

  

此方法只能用于测量经过时间,与系统或挂钟时间的任何其他概念无关。返回的值表示纳秒,因为某些固定但任意的原始时间(可能在未来,因此值可能为负)。在Java虚拟机的实例中,此方法的所有调用都使用相同的原点;其他虚拟机实例可能使用不同的来源。

  

这里需要在for循环的每次迭代中为Date生成不同的值。

您可以尝试通过添加 i 值,在几分钟/天内将时间添加到当前日期?

答案 1 :(得分:2)

第一个代码段按预期工作。循环中的所有步骤同时执行。如果你想要不同的时间,那么sleep执行线程:

for (int i = 0; i < 10; i++) {
    System.out.println(new Date(System.currentTimeMillis()));
    Thread.sleep(1000);
}

会给出以下内容:

Mon Oct 30 10:10:10 EDT 2017
Mon Oct 30 10:10:11 EDT 2017
Mon Oct 30 10:10:12 EDT 2017
Mon Oct 30 10:10:13 EDT 2017
Mon Oct 30 10:10:14 EDT 2017
Mon Oct 30 10:10:15 EDT 2017
Mon Oct 30 10:10:16 EDT 2017
Mon Oct 30 10:10:17 EDT 2017
Mon Oct 30 10:10:18 EDT 2017
Mon Oct 30 10:10:19 EDT 2017

第二个代码片段的错误是Date期望构造函数中的millis。实际应该使用nanoTime()来获取delta,如

  

返回的值表示纳秒,因为某些固定但是任意时间(可能在将来,因此值可能为负)。

答案 2 :(得分:1)

如果唯一的要求是日期彼此不同,那么您可以在循环中手动增加日期任意数量。

如果您使用的是Java 8或更高版本,我还建议您不要使用旧的java.util.Date API并开始使用java.time

Instant instant = Instant.now();
for ( int i = 0; i < 10; i++ )
{
    System.out.println( instant.toString() );
    // Choose whatever interval size you need in your specific case.
    instant = instant.plus( 1, ChronoUnit.MILLIS );
}

如果确实需要使用Date.from( instant ),您仍然可以转换回Date对象。

编辑:看到你的更新要求,我现在调整了我的答案。

您需要注意以下几个限制:

  • 系统时钟分辨率: 您不会手动伪造一些日期(例如,通过在循环中每次迭代添加毫秒),因为系统时钟的分辨率不够精确,无法在每次调用时生成不同的时间戳。

  • 数据库中列的数据类型: 数据库通常只能对它们可以存储的日期值进行有限的精度。例如,Oracle的旧Date数据类型只能存储精度达到几秒而且没有分数。我相信MS SQLServer的DateTime类型将其毫秒数舍入到最接近的三分之一秒或类似的东西。

  • Java数据类型精度: 旧的java.util.Date类型只能存储高达毫秒的精度。 java.time.Instant也可以存储纳秒。 Java 8中的JDBC带有接受Instant而不是Date的匹配方法,但实际数据库及其JDBC驱动程序实现当然也需要实际支持该精度。

答案 3 :(得分:0)

new Date(long time) gives a date based on milliseconds - 这不是它给出错误的日期,而是给出了错误时间的正确日期

System.currentTimeMillis()给出正确的约会时间,而System.nanoTime()约为正确时间的1000倍(以毫秒为单位)

使用new Date()而不是new Date(System.currentTimeMillis())as they will both give the current time to the closest millisecond

可能更容易

如果您的目标是获得类似的日期,请尝试增加初始化日期的时间(在这种情况下为1秒差异)

long now = System.currentTimeMillis();
for(int i = 0; i < 10; i++)
    System.out.println(new Date(now + i * 1000));