Подтвердить что ты не робот

Самый идиоматический способ печати разницы во времени в Java?

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

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

Но есть ли хороший способ распечатать полное время в указанном формате (например, HH: MM: SS) либо с помощью Apache Commons, либо даже с объектами API Дата/Время с ужасной платформой? Другими словами, что является самым коротким, простейшим, бессмысленным способом написать временной формат, полученный из миллисекунд в Java?

4b9b3361

Ответ 1

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");

Ответ 2

Библиотека, предназначенная для этой цели, - это лучший подход, но 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

Ответ 3

ТЛ; др

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. И поиск Qaru для многих примеров и объяснений. Спецификация - JSR 310.

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

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

  • Java SE 8, Java SE 9, Java SE 10 и более поздние версии
    • Встроенный.
    • Часть стандартного Java API с интегрированной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональных возможностей java.time включена обратно в Java 6 и 7 в ThreeTen-Backport.
  • Android
    • Более поздние версии реализаций пакетов Android классов java.time.
    • Для более ранних Android (<26), то ThreeTenABP проект адаптирует ThreeTen-Backport (упоминалось выше). См. Раздел Как использовать ThreeTenABP....

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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));