java - 在Java中将代表分钟的Double变量添加到Date中

标签 java date double

我有一个起点-终点矩阵,表示 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 类,请继续阅读。

避免使用小数表示耗时

使用 doubleDouble 来表示耗时不是一个好主意。首先,该类型使用 floating-point牺牲准确性以换取执行速度的技术。因此,小数点右侧经常会出现无关的额外数字。

其次,这是一种处理时间的尴尬方式,因为我们有六十秒到一分钟,六十分钟到一小时等等。

  • 在 Java 中,使用 PeriodDuration类。请参阅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.345SDuration 也可以解析此类字符串。

String output = duration.toString(); // PT8H6M12.345S

...或者走向另一个方向...

Duration duration = Duration.parse( "PT8H6M12.345S" );

关于java - 在Java中将代表分钟的Double变量添加到Date中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39480681/

相关文章:

java - 过多使用 LinkedList

java - 如何通过桌面java应用程序查询google?

python - Pandas - 填充时间序列数据中缺失的时间

java - 格式 hh :mm:ss 的解析时间

c - C中的double类型和short类型有什么区别?

Java 鼠标光标图像未显示,重绘错误

java - 包含两个 ListFragment 的 fragment

c# - 双重 TryParse 混淆

javascript - flot 中的直方图 - Javascript

objective-c - Objective C - 如何将 double 转换为 long