这里需要在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循环中添加第二个会解决问题但是假时间。遗憾的是,添加睡眠不是一个选项,因为代码需要尽快添加记录并退出
答案 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));