我有一个起点-终点矩阵,表示 2 点之间耗时(以分钟为单位)。我想知道将耗时添加到日期的最佳方法是什么。
Date clock;
SimpleDateFormat reqDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
clock = reqDF.parse(line[25]);
Double distance = distDB.find_distance(O, D, mode, facility_id);
Date current_time = clock + distance;
如果我使用日历类型而不是日期类型会更容易吗?
谢谢
最佳答案
tl;博士
Instant.parse( "2016-12-23T01:23:45Z" )
.plusNanos( Math.round(
yourNumberOfMinutesAsDouble *
TimeUnit.MINUTES.toNanos( 1 ) )
)
避免旧的日期时间类。
实际上,您既不应该使用java.util.Date
,也不应该使用java.util.Calendar
。这些旧的遗留类是出了名的麻烦、困惑和缺陷。现在被 java.time 类取代。
对于旧类,Answer by Jireugi是正确的。对于 java.time 类,请继续阅读。
避免使用小数表示耗时
使用 double
或 Double
来表示耗时不是一个好主意。首先,该类型使用 floating-point牺牲准确性以换取执行速度的技术。因此,小数点右侧经常会出现无关的额外数字。
其次,这是一种处理时间的尴尬方式,因为我们有六十秒到一分钟,六十分钟到一小时等等。
- 在 Java 中,使用
Period
或Duration
类。请参阅Oracle Tutorial . - 在文本中,使用标准 ISO 8601格式
PnYnMnDTnHnMnS
,其中P
标记开始,T
将年-月-日与时-分-秒分开。所以两分半钟就是PT2M30S
。
纳秒
如果我们必须使用 Double
作为耗时的分钟数,让我们将小数十进制数转换为整数(整数)。
请注意,旧的遗留日期时间类的分辨率仅限于毫秒,而 java.time 类的精度可以达到纳秒。因此,我们希望将您的 Double
转换为整数纳秒。
我们不用硬编码一分钟内纳秒数的神奇数字来进行此计算,而是使用 TimeUnit
枚举。该类可以为我们计算一分钟内的纳秒数 ( 60 * 1_000_000_000L )。
最后,Math.round
函数返回最接近参数的 long,并舍入为正无穷大。
long nanoseconds = Math.round(
yourNumberOfMinutesAsDouble *
TimeUnit.MINUTES.toNanos( 1 )
);
即时
如果使用 UTC 中的日期时间值,使用Instant
类(class)。每个Instant
代表 UTC 中时间轴上的一个时刻。分辨率为nanoseconds 。
Instant Instant.parse( "2016-12-23T01:23:45Z" )
Instant future = Instant.plusNanos( nanoseconds );
持续时间
我强烈建议您传递 Duration
对象,而不是传递 Double
作为耗时。
Duration duration = Duration.ofNanos( Math.round( yourNumberOfMinutesAsDouble * TimeUnit.MINUTES.toNanos( 1 ) ) );
您可以使用持续时间
进行数学运算,例如加号
和减号
。
Instant instant = Instant.parse( "2016-12-23T01:23:45Z" )
Instant future = instant.plus( duration );
您只需调用 toString
即可生成标准 ISO 8601 格式的 Duration
字符串表示形式,例如 PT8H6M12.345S
。 Duration
也可以解析此类字符串。
String output = duration.toString(); // PT8H6M12.345S
...或者走向另一个方向...
Duration duration = Duration.parse( "PT8H6M12.345S" );
关于java - 在Java中将代表分钟的Double变量添加到Date中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39480681/