双时间单位转换
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。
太棒了!如果在 from
和 to
参数中传递了相同的 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);
}
}
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。
太棒了!如果在 from
和 to
参数中传递了相同的 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);
}
}