首页 > 解决方案 > 转换日期中具有特定范围的随机数

问题描述

我正在尝试读取随机数并将它们转换为日期。我尝试使用 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”

我不明白我的错误在哪里

标签: javadaterandom

解决方案


不要使用日期。使用即时。

    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 中不起作用。所以你需要传递一些不依赖于d1to 的东西nextLong

例外:您可能会说递归方法是根据自身定义的。但这是一个不同的故事。

你的编译器说:

局部变量 d1 可能尚未初始化

我们想要一个更清晰的错误信息。在这种情况下,它可以安全地说尚未初始化(在可能不合适的情况下使用相同的消息)。值得注意的是,它指向d1in d1.getTime():您试图在d1初始化之前使用 的值。

教程链接

Oracle 教程:日期时间解释如何使用 java.time。


推荐阅读