双时间单位转换

Double Timeunit Conversion

TimeUnit.toSeconds 在结果 > 1 时效果很好。但是,因为我们处理的是长整数,如果结果介于 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

我想要一个函数来处理 returns 0.001

的双打

非常好,值得作为答案并具有正确的格式。它给你大约一半你想要的。如果你要自己做乘法或除法,你至少可以从库枚举中获取要乘法或除法的数字。

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。

太棒了!如果在 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);
    }
}