双时间单位转换

时间:2018-03-13 16:49:15

标签: java timeunit

当结果为>时,TimeUnit.toSeconds运行良好。但是,因为我们正在处理多头,如果结果介于0和1之间,那么我们得到0。是一个为我们处理双重转换的java SDK函数吗?

我知道我可以通过乘以或除以适当的双精度来执行这些转换。但是,它容易出错并且读取不好。我更喜欢使用Java SDK中的现有函数,类似于Java的TimeUnit。

证明我情况的最小例子:

import java.util.*;
import java.util.concurrent.*;
public class Main {
    public static void main(String[] args) {
        System.out.println(TimeUnit.MILLISECONDS.toSeconds(1));
    }
}

输出:

0

我想要一个能够处理返回0.001

的双精度的函数

2 个答案:

答案 0 :(得分:5)

korolar’s suggestion非常好,它应该是一个答案,并有适当的格式。它给你大约一半你想要的。如果您要自己进行乘法或除法,您至少可以将数字乘以或从库枚举中除以。

public static double millisToSeconds(long millis) {
    return (double) millis / TimeUnit.SECONDS.toMillis(1);
}

现在millisToSeconds(1)给出0.001。我同意JB Nizet和VGR的意见,你应该将计算包装在一个名称很好的方法中,以保证代码的可读性。如果您希望方法更通用:

public static double convertTimeUnit(double amount, TimeUnit from, TimeUnit to) {
    // is from or to the larger unit?
    if (from.ordinal() < to.ordinal()) { // from is smaller
        return amount / from.convert(1, to);
    } else {
        return amount * to.convert(1, from);
    }
}

现在convertTimeUnit(1, TimeUnit.MILLISECONDS, TimeUnit.SECONDS)和以前一样给出0.001,而convertTimeUnit(1, TimeUnit.SECONDS, TimeUnit.MILLISECONDS)给出1000.0。

答案 1 :(得分:0)

太好了!我将通过添加额外的检查来增加该方法,以避免在fromto参数中传递相同的TimeUnit时进行无用的转换:

public static double convertTimeUnit(double amount, TimeUnit from, TimeUnit to) {
    // if the same unit is passed, avoid the conversion
    if (from == to) {
        return amount;
    }
    // is from or to the larger unit?
    if (from.ordinal() < to.ordinal()) { // from is smaller
        return amount / from.convert(1, to);
    } else {
        return amount * to.convert(1, from);
    }
}