使用带有浮点的新java时间API

使用带有浮点的新java时间API,java,datetime,Java,Datetime,我正在看新的java.time.*API。与旧的java.util.DateAPI相比,使用它似乎非常方便。我唯一的问题是:我认为一些模型描述了内部使用函数评估的代码:双 s,描述了已过的非整数量秒。我是否可以使用浮点构造/操作Duration/LocalDateTime对象(然后应将其转换为适当的秒/毫秒/纳秒持续时间)?我还没有使用它,但您似乎可以使用它。将double变量适当格式化为字符串,例如 String dateString = "PT"+Double.toString(yourDo

我正在看新的
java.time.*
API。与旧的
java.util.Date
API相比,使用它似乎非常方便。我唯一的问题是:我认为一些模型描述了内部使用函数评估的代码:<代码>双 s,描述了已过的非整数量秒。我是否可以使用浮点构造/操作
Duration
/
LocalDateTime
对象(然后应将其转换为适当的秒/毫秒/纳秒持续时间)?

我还没有使用它,但您似乎可以使用它。将
double
变量适当格式化为字符串,例如

String dateString = "PT"+Double.toString(yourDouble)+"s";
Duration myDuration = Duration.parse(dateString);

然后,您可以从
Duration
对象中获取秒、毫秒等。好的,我对此进行了一些思考,并提出了两种方法:

首先,如前所述,可以创建一个字符串,然后将其解析为浮点,如下所示:

DecimalFormat df = new DecimalFormat("#");
df.setMaximumFractionDigits(8);

String dateString = df.format(val);

if(dateString.startsWith(".")) {
    dateString = "0" + dateString;
}

Duration.parse("PT" + dateString + "s");
之所以需要整个骗局,是因为
Duration
类对有效浮点序列的外观相当挑剔,特别是它似乎必须以数字开头,并且不允许使用科学符号

作为替代方案,以下一种班轮将表现良好:

Duration.ofNanos((long) (val * 1e9));
显然,有些小数被截断了(我想可能会出现溢出?!),但就我而言,这已经足够准确了


后一种方法的主要优点是性能:对于10000000个随机生成的值样本,字符串解析在我的机器上大约需要20秒,而从纳秒创建只需要大约0.3秒。

我必须说,我对这种方法并不完全满意。在我的设置中,性能似乎是个问题。你能详细说明一下吗?你所说的性能是个问题是什么意思?它很慢,还是失败了?这是一个关于ideone的工作示例——好吧,只是说解析需要很长时间。例如,
Duration.of millis(Math.round(1000*myDouble))
是一个非常快的方法,足够公平了。如果你愿意(我想),你可以随时添加另一个答案,说明你发现它更快——或者将它编辑到我的答案中作为替代(我很乐意批准这样的编辑)。对我来说,
的百万
要快得多,这当然是一个新知识,所以你的研究可能会帮助其他人。请注意,浮点永远是一个近似值。
“”+0.20
的文本表示可能有几个数字。因此,不是解析,而是乘法和舍入似乎是可行的方法。