Двойное Преобразование Времени

TimeUnit.toSeconds хорошо работает, когда результат> 1. Однако, поскольку мы имеем дело с long, если результат находится в диапазоне от 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

1 ответ

Решение

Предложение Короляра настолько хорошо, что заслуживает того, чтобы быть ответом и иметь правильное форматирование. Это дает вам примерно половину того, что вы хотите. Если вы хотите сделать умножение или деление самостоятельно, вы можете, по крайней мере, взять число для умножения или деления из перечисления библиотеки.

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.

Превосходно! Я бы увеличил этот метод, добавив дополнительную проверку, чтобы избежать бесполезного преобразования, если один и тот же TimeUnit передается в обоихfrom а также to параметры:

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);
    }
}
Другие вопросы по тегам