java - 转换日期中具有特定范围的随机数
问题描述
我正在尝试读取随机数并将它们转换为日期。我尝试使用 java.util.date 和 ThreadLocalRandom 为第一个数字做这件事。它说'局部变量 d1 可能尚未初始化'
import java.util.concurrent.ThreadLocalRandom;
import java.util.Date;
public class TestDate {
public static void main(String[] args) {
Date d1 = new Date(ThreadLocalRandom.current().nextLong(d1.getTime()));
System.out.println("Today's date is: " + d1.toString());
System.out.println("Milliseconds: " + d1.getTime());
}
}
当我只是将 d1 设置为变量时,它会显示“复制局部变量 d1”
我不明白我的错误在哪里
解决方案
不要使用日期。使用即时。
Instant now = Instant.now();
Instant someTime = Instant.ofEpochMilli(
ThreadLocalRandom.current().nextLong(now.toEpochMilli()));
System.out.println(someTime);
示例输出:
2000-09-12T12:14:59.258Z
该代码在 1970 年 1 月 1 日 00:00 UTC(包括)和现在(不包括)的纪元之间生成一个随机时间点。
Date
您尝试使用的课程设计不佳,幸运的是早已过时。不要使用它。使用 java.time,现代 Java 日期和时间 API。与它一起工作要好得多。暂时使用的类是Instant
.
你的代码出了什么问题?
Date d1 = new Date(ThreadLocalRandom.current().nextLong(d1.getTime()));
在这一行中,您尝试声明一个变量d1
并使用值 if 为其分配一个初始值d1
。这会产生循环依赖。虽然根据自身定义某些东西有时可能在人类语言中起作用,因为人类可以自己思考,但它在 Java 中不起作用。所以你需要传递一些不依赖于d1
to 的东西nextLong
。
例外:您可能会说递归方法是根据自身定义的。但这是一个不同的故事。
你的编译器说:
局部变量 d1 可能尚未初始化
我们想要一个更清晰的错误信息。在这种情况下,它可以安全地说尚未初始化(在可能不合适的情况下使用相同的消息)。值得注意的是,它指向d1
in d1.getTime()
:您试图在d1
初始化之前使用 的值。
教程链接
Oracle 教程:日期时间解释如何使用 java.time。