Самый идиоматический способ распечатать разницу во времени в Java? - PullRequest
15 голосов
/ 24 апреля 2010

Я знаком с разницей во времени печати в миллисекундах:

 long time = System.currentTimeMillis();
 //do something that takes some time...
 long completedIn = System.currentTimeMillis() - time;

Но, есть ли хороший способ напечатать полное время в указанном формате (например: ЧЧ: ММ: СС), используя Apache Commons или даже объекты Date / Time API страшной платформы? Другими словами, каков самый короткий, самый простой и не бессмысленный способ написать формат времени, полученный из Java в миллисекундах?

Ответы [ 6 ]

21 голосов
/ 24 апреля 2010

Apache Commons имеет класс DurationFormatUtils для применения указанного формата к временной продолжительности. Итак, что-то вроде:

long time = System.currentTimeMillis();
//do something that takes some time...
long completedIn = System.currentTimeMillis() - time;

DurationFormatUtils.formatDuration(completedIn, "HH:mm:ss:SS");
5 голосов
/ 24 апреля 2010

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

import java.text.DateFormat;
import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.TimeZone;

public class Elapsed {

    private static final long MS_DAY = 24 * 60 * 60 * 1000;
    private final DateFormat df = new SimpleDateFormat("HH : mm : ss : S");

    public Elapsed() {
        df.setTimeZone(TimeZone.getTimeZone("GMT"));
    }

    private String format(long elapsed) {
        long day = elapsed / MS_DAY;
        StringBuilder sb = new StringBuilder();
        sb.append(day);
        sb.append(" : ");
        sb.append(df.format(new Date(elapsed)));
        return sb.toString();
    }

    public static void main(String[] args) {
        Elapsed e = new Elapsed();
        for (long t = 0; t < 3 * MS_DAY; t += MS_DAY / 2) {
            System.out.println(e.format(t));
        }
    }
}

Вывод на консоль:

0 : 00 : 00 : 00 : 0
0 : 12 : 00 : 00 : 0
1 : 00 : 00 : 00 : 0
1 : 12 : 00 : 00 : 0
2 : 00 : 00 : 00 : 0
2 : 12 : 00 : 00 : 0
2 голосов
/ 23 января 2017

ТЛ; др

Duration.ofMillis( … )
        .toString()

... или ...

Duration.between(      // `Duration` represents a span of time unattached to the timeline, in a scale of days-hours-minutes-seconds-nanos.
    instantEarlier ,   // Capture the current moment to start.
    Instant.now()      // Capture the current moment now, in UTC.
)                      // Returns a `Duration` object.
.toString()            // Generate a string in standard ISO 8601 format.

PT1M23.407S

ISO 8601

что является самым коротким, простым и бессмысленным способом записи формата времени, полученного из миллисекунд

Стандарт ISO 8601 определяет текстовые форматы для значений даты и времени. Эти форматы действительно короткие, простые и без излишеств. Они в значительной степени удобочитаемы для разных культур, практичны и однозначны.

Для промежутков времени, не привязанных к временной шкале, стандартный формат равен PnYnMnDTnHnMnS. P отмечает начало, а T отделяет годы-месяцы-дни от часов-минут-секунд. Так что полтора часа - это PT1H30M.

java.time.Duration

Классы java.time включают пару классов для представления промежутков времени. Класс Duration предназначен для часов-минут-секунд, а Period.

Instant

Класс Instant представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) цифр десятичного знака) доля).

Instant earlier = Instant.now() ;  // Capture the current moment in UTC.
… 
Instant later = Instant.now() ;

Duration d = Duration.between( earlier , later ) ;
String output = d.toString() ;  

PT3.52S


О java.time

Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar и & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует выполнить переход на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

Вы можете обмениваться java.time объектами напрямую с вашей базой данных. Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

1 голос
/ 24 апреля 2010

Не в моих силах. Но printf () может сделать это легко, если вы вычислите значения для H, M и S и используете шаблон% 02 для каждого.

1 голос
/ 24 апреля 2010

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

Если вам нужен более мощный (но, конечно, не более простой) способ сбора статистики производительности, есть Perf4J .

0 голосов
/ 26 июня 2013
long diff = System.currentTimeMillis() - startTime;
int hours = (int)(diff / 3600000); diff -= hours * 3600000;
int mins = (int)(diff / 60000); diff -= mins * 60000;
int secs = (int)(diff / 1000); diff -= secs * 1000;
System.out.println(String.format("%d:%d:%d.%d", hours, mins, secs, diff));
...