Рассчитать прошедшее время в Java / Groovy - PullRequest
38 голосов
/ 20 февраля 2009

у меня есть ...


Date start = new Date()

...
...
...

Date stop = new Date()

Я бы хотел, чтобы между этими двумя датами прошли годы, месяцы, дни, часы, минуты и секунды.

-

Я уточню вопрос.

Я просто хочу получить истекшее время как абсолютную меру, то есть без учета високосных годов, дней каждого месяца и т. Д.

Таким образом, я думаю, что невозможно истечь годы и месяцы, все, что я могу получить, это дни, часы, минуты и секунды.

Более конкретно, я хочу сказать, что определенное задание длилось, например,

20 sec
13 min, 4 sec
2 h, 10 min, 2 sec
4 d, 4 h, 2 min, 2 sec

Так что, пожалуйста, прости мое отсутствие точности.

Ответы [ 15 ]

0 голосов
/ 04 мая 2019

Я делаю это в общем:

def start_time = System.currentTimeMillis()
...
def end_time = System.currentTimeMillis()

println  (end_time - start_time) +' ms'

Затем вы можете разбить это на любую единицу времени, которую хотите, используя класс Duration Groovy http://docs.groovy -lang.org / latest / html / api / groovy / time / Duration.html .

0 голосов
/ 17 октября 2011

Это еще одна похожая функция, она не будет отображать дни, часы, минуты и т. Д., Если она не нужна, при необходимости измените ее литералы.

public class ElapsedTime {

    public static void main(String args[]) {

        long start = System.currentTimeMillis();
        start -= (24 * 60 * 60 * 1000 * 2);
        start -= (60 * 60 * 1000 * 2);
        start -= (60 * 1000 * 3);
        start -= (1000 * 55);
        start -= 666;
        long end = System.currentTimeMillis();
        System.out.println(elapsedTime(start, end));

    }

    public static String elapsedTime(long start, long end) {

        String auxRet = "";

        long aux = end - start;
        long days = 0, hours = 0, minutes = 0, seconds = 0, milliseconds = 0;
        // days
        if (aux > 24 * 60 * 60 * 1000) {
            days = aux / (24 * 60 * 60 * 1000);
        }
        aux = aux % (24 * 60 * 60 * 1000);
        // hours
        if (aux > 60 * 60 * 1000) {
            hours = aux / (60 * 60 * 1000);
        }
        aux = aux % (60 * 60 * 1000);
        // minutes
        if (aux > 60 * 1000) {
            minutes = aux / (60 * 1000);
        }
        aux = aux % (60 * 1000);
        // seconds
        if (aux > 1000) {
            seconds = aux / (1000);
        }
        milliseconds = aux % 1000;

        if (days > 0) {
            auxRet = days + " days ";
        }
        if (days != 0 || hours > 0) {
            auxRet += hours + " hours ";
        }
        if (days != 0 || hours != 0 || minutes > 0) {
            auxRet += minutes + " minutes ";
        }
        if (days != 0 || hours != 0 || minutes != 0 || seconds > 0) {
            auxRet += seconds + " seconds ";
        }
        auxRet += milliseconds + " milliseconds ";

        return auxRet;
    }

}
0 голосов
/ 19 августа 2011

Это полная функция, которую я реализовал на основе ответа Себастьян Селис . И снова, из его поста - это не принимает во внимание такие вещи, как високосные годы или переход на летнее время. Это чистое прошедшее время .

Вывод с учетом моих потребностей. Это выводит только три значимых раздела. Вместо возврата

4 месяца, 2 недели, 3 дня, 7 часов, 28 минут, 43 секунды

Он просто возвращает первые 3 блока (см. Больше примеров в конце поста) :

4 месяца, 2 недели, 3 дня

Вот полный исходный код метода:

/**
 * Format milliseconds to elapsed time format
 * 
 * @param time difference in milliseconds
 * @return Human readable string representation - eg. 2 days, 14 hours, 5 minutes
 */
public static String formatTimeElapsedSinceMillisecond(long milisDiff) {
    if(milisDiff<1000){ return "0 second";}

    String formattedTime = "";
    long secondInMillis = 1000;
    long minuteInMillis = secondInMillis * 60;
    long hourInMillis = minuteInMillis * 60;
    long dayInMillis = hourInMillis * 24;
    long weekInMillis = dayInMillis * 7;
    long monthInMillis = dayInMillis * 30;

    int timeElapsed[] = new int[6];
    // Define time units - plural cases are handled inside loop
    String timeElapsedText[] = {"second", "minute", "hour", "day", "week", "month"};
    timeElapsed[5] = (int) (milisDiff / monthInMillis); // months
    milisDiff = milisDiff % monthInMillis;
    timeElapsed[4] = (int) (milisDiff / weekInMillis); // weeks
    milisDiff = milisDiff % weekInMillis;
    timeElapsed[3] = (int) (milisDiff / dayInMillis); // days
    milisDiff = milisDiff % dayInMillis;
    timeElapsed[2] = (int) (milisDiff / hourInMillis); // hours
    milisDiff = milisDiff % hourInMillis;
    timeElapsed[1] = (int) (milisDiff / minuteInMillis); // minutes
    milisDiff = milisDiff % minuteInMillis;
    timeElapsed[0] = (int) (milisDiff / secondInMillis); // seconds

    // Only adds 3 significant high valued units
    for(int i=(timeElapsed.length-1), j=0; i>=0 && j<3; i--){
        // loop from high to low time unit
        if(timeElapsed[i] > 0){
            formattedTime += ((j>0)? ", " :"") 
                + timeElapsed[i] 
                + " " + timeElapsedText[i] 
                + ( (timeElapsed[i]>1)? "s" : "" );
            ++j;
        }
    } // end for - build string

    return formattedTime;
} // end of formatTimeElapsedSinceMillisecond utility method

Вот пример теста:

System.out.println(formatTimeElapsedSinceMillisecond(21432424234L));
// Output: 8 months, 1 week, 1 day

System.out.println(formatTimeElapsedSinceMillisecond(87724294L));
// Output: 1 day, 22 minutes, 4 seconds

System.out.println(formatTimeElapsedSinceMillisecond(123434L));
// Output: 2 minutes, 3 seconds
0 голосов
/ 30 января 2011

Это проблема, и необходимо сделать алгоритм для учета високосных лет и точного количества месяцев и дней помимо лет. Интересно, как просто, если используется только одна единица измерения. Например, общее число дней между двумя днями является верным, поскольку количество напоминаний дней после числа месяцев и лет рассчитывается, скажем, в течение двух десятилетий.

В настоящее время я работаю над этим, чтобы предоставить его из моей реализации PML, например, в виде:

unemployed <- date.difference[
    From = 2009-07-01, 
    Till = now, 
    YEARS, MONTHS, DAYS
]: yyyy-MM-dd

$$-> *unemployed -> date.translate[ YEARS, MONTHS, DAYS ] -> print["Unemployed for:", .]

Конечно, это также было бы полезно и требовалось для точных расчетов процентной ставки.

0 голосов
/ 21 ноября 2009

Нет смысла создавать объект Date, так как все, что он делает - это оборачивает System.currentTimeMillis (). Функция getTime () просто разворачивает объект Date. Я предлагаю вам просто использовать эту функцию, чтобы получить длинный.

Если вам нужна только вторая точность, это нормально. Однако, если вы хотите получить точность до миллисекунды, используйте System.nanoTime (), чтобы получить время истечения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...