Вычислите прошедшее время в Java / Groovy

Если вы действительно хотите избежать оператора ->, вы можете написать его так:

 cout << (*((*root).left)).key;

... но писать это больно и читать больно, поэтому это хороший пример почему полезен оператор ->:)

39
задан S.L. Barth - Reinstate Monica 21 July 2012 в 17:27
поделиться

8 ответов

Не настолько легкий со стандартной Датой API.

Вы могли бы хотеть посмотреть Время Joda , или JSR-310 вместо этого.

я не эксперт в Joda, но я думаю, что код был бы:

Interval interval = new Interval(d1.getTime(), d2.getTime());
Period period = interval.toPeriod();
System.out.printf(
    "%d years, %d months, %d days, %d hours, %d minutes, %d seconds%n", 
    period.getYears(), period.getMonths(), period.getDays(),
    period.getHours(), period.getMinutes(), period.getSeconds());
19
ответ дан toolkit 27 November 2019 в 02:01
поделиться

Можно сделать все это с подразделением и модификацией.

long l1 = start.getTime();
long l2 = stop.getTime();
long diff = l2 - l1;

long secondInMillis = 1000;
long minuteInMillis = secondInMillis * 60;
long hourInMillis = minuteInMillis * 60;
long dayInMillis = hourInMillis * 24;

long elapsedDays = diff / dayInMillis;
diff = diff % dayInMillis;
long elapsedHours = diff / hourInMillis;
diff = diff % hourInMillis;
long elapsedMinutes = diff / minuteInMillis;
diff = diff % minuteInMillis;
long elapsedSeconds = diff / secondInMillis;

, Который должен дать Вам всю информацию, которую Вы запросили.

РЕДАКТИРОВАНИЕ: Так как люди, кажется, смущены, нет, это не берет вещи как високосные годы или переключатели летнего времени во внимание. Это чисто прошедший время , который является что opensas, относительно которого попросили.

25
ответ дан Sebastian Celis 27 November 2019 в 02:01
поделиться

Хм, если я получаю то, что Вы спрашиваете, Вы хотите знать что если:

запускаются = Jan 1, 2001, 10:00:00.000 и

остановка = Jan 6, 2003, 12:01:00.000 пополудни

, Вы хотите ответ 2 лет, 0 месяцев, 5 дней, 2 часов, 1 минуты

, К сожалению, это - показной ответ. Что, если даты были Jan 2 и Jan 31? Это составило бы 29 дней? Хорошо, но 2 февраля до 2 марта 28 (29) дни, но был бы перечислен как 1 месяц?

отрезок времени в чем-либо кроме секунд или возможно дни являются переменными, не зная контекст с месяцев, и годы имеют различные длины. Различие между 2 датами должно быть в статических единицах, которые легко вычислимы от stop.getTime () - start.getTime () (который является различием в millisecs)

3
ответ дан billjamesdev 27 November 2019 в 02:01
поделиться

Что касается JodaTime, я только что начал; спасибо автору, который это предложил. Вот более сжатая версия предложенного кода Joda:

Period period = new Period(d1.getTime(), d2.getTime());
System.out.printf(
    "%d years, %d months, %d days, %d hours, %d minutes, %d seconds%n", 
    period.getYears(), period.getMonths(), period.getDays(),
    period.getHours(), period.getMinutes(), period.getSeconds());

(не уверен, помогает ли это исходный вопрос, но определенно поисковикам).

10
ответ дан 27 November 2019 в 02:01
поделиться

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

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

0
ответ дан 27 November 2019 в 02:01
поделиться

Помимо вышеупомянутого замечательного JodaTime API, который я рекомендую , лучшей стандартной альтернативой Java, которую вы можете иметь, является java.util .Календарь . Это громоздко для работы с ним (это преуменьшение ... посмотрите здесь однострочные примеры JodaTime), но вы также можете рассчитать с его помощью прошедшее время. Важный ключ заключается в том, что вы должны использовать Calendar # add () в цикле, чтобы получить прошедшее значение за годы, месяцы и дни с учетом високосных дней, лет и столетий. Вы не должны рассчитывать их обратно из (милли) секунд.

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

import java.util.Calendar;

public class Test {

    public static void main(String[] args) throws Exception {
        Calendar start = Calendar.getInstance();
        start.set(1978, 2, 26, 12, 35, 0); // Just an example.
        Calendar end = Calendar.getInstance();

        Integer[] elapsed = new Integer[6];
        Calendar clone = (Calendar) start.clone(); // Otherwise changes are been reflected.
        elapsed[0] = elapsed(clone, end, Calendar.YEAR);
        clone.add(Calendar.YEAR, elapsed[0]);
        elapsed[1] = elapsed(clone, end, Calendar.MONTH);
        clone.add(Calendar.MONTH, elapsed[1]);
        elapsed[2] = elapsed(clone, end, Calendar.DATE);
        clone.add(Calendar.DATE, elapsed[2]);
        elapsed[3] = (int) (end.getTimeInMillis() - clone.getTimeInMillis()) / 3600000;
        clone.add(Calendar.HOUR, elapsed[3]);
        elapsed[4] = (int) (end.getTimeInMillis() - clone.getTimeInMillis()) / 60000;
        clone.add(Calendar.MINUTE, elapsed[4]);
        elapsed[5] = (int) (end.getTimeInMillis() - clone.getTimeInMillis()) / 1000;

        System.out.format("%d years, %d months, %d days, %d hours, %d minutes, %d seconds", elapsed);
    }

    private static int elapsed(Calendar before, Calendar after, int field) {
        Calendar clone = (Calendar) before.clone(); // Otherwise changes are been reflected.
        int elapsed = -1;
        while (!clone.after(after)) {
            clone.add(field, 1);
            elapsed++;
        }
        return elapsed;
    }

}

Должен быть указан мой возраст на данный момент =)

О, я должен добавить, вы можете "преобразовать"

3
ответ дан 27 November 2019 в 02:01
поделиться

Я только что обнаружил это быстрое решение на основе Groovy:

import groovy.time.TimeCategory 
import groovy.time.TimeDuration

TimeDuration td = TimeCategory.minus( stop, start )
println td
96
ответ дан 27 November 2019 в 02:01
поделиться

Что ж, начиная с Java 1.5 вы должны использовать TimeUnit.

Вот простой и понятный пример этого. Я думаю, что в Groovy он может стать короче (как всегда).

/**
 * Formats a given {@link Date} to display a since-then timespan.
 * @param created
 * @return String with a format like "3 minutes ago"
 */
public static String getElapsedTime(Date created) {
    long duration = System.currentTimeMillis() - created.getTime();
    long seconds = TimeUnit.MILLISECONDS.toSeconds(duration);
    long days = TimeUnit.MILLISECONDS.toDays(duration);
    long hours = TimeUnit.MILLISECONDS.toHours(duration);
    long minutes = TimeUnit.MILLISECONDS.toMinutes(duration);
    if (days > 0) {
        return days + " days";
    }
    if (hours > 0) {
        return hours + " hrs";
    }
    if (minutes > 0) {
        return minutes + " minutes";
    }

    return seconds + " seconds";
}

Да, пожалуйста, избегайте многократных возвратов;)

6
ответ дан 27 November 2019 в 02:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: