Сравните два раза в формате ММ: СС - PullRequest
2 голосов
/ 18 сентября 2019

Я хочу сравнить два раза в формате MM: SS и получить разницу между этими двумя значениями в секундах.

Например, время 1 = 20:28, время 2 = 20: 18

* 1004.* Разница составляет -10 секунд

Я пытался использовать следующий подход для сравнения времени

        LocalTime start = LocalTime.parse( "20:28" );
        LocalTime stop = LocalTime.parse( "20:18" );
        Duration duration = Duration.between( start, stop );
        System.out.println(duration.getSeconds());

Фактический : выводит -600 секунд в качестве вывода,потому что время анализируется в формате ЧЧ: ММ.

Ожидается -10

Существует ли какой-либо другой подход, с помощью которого я могу получить ожидаемый результат, учитывая формат MM: SS.

Ответы [ 4 ]

2 голосов
/ 19 сентября 2019

Возможно, вы неправильно используете LocalTime.

Предполагая, что вам нужно то, что вы говорите, уловка состоит в том, чтобы определить форматер, который предполагает, что час дня равен 0. Метод parseDefaultingDateTImeFormatterBuilder - это то, что нам нужно для этого:

    DateTimeFormatter mmssFormatter = new DateTimeFormatterBuilder()
            .appendPattern("mm:ss")
            .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
            .toFormatter();

    LocalTime start = LocalTime.parse( "20:28", mmssFormatter );
    LocalTime stop = LocalTime.parse( "20:18", mmssFormatter );
    Duration duration = Duration.between( start, stop );
    System.out.println(duration.getSeconds());

Вывод:

-10

Строки времени анализируются на время00:20:28 и 00:20:18.Я не понимаю, какой смысл ограничивать себя временем между 00:00:00 и 01:00:00 ночью.Если вместо этого ваше время относится к некоторому моменту, который не обязательно равен 00:00, то для них может быть более правильным использовать Duration.Идея состоит в том, что 20:28 - это не время суток, но можно рассматривать как продолжительность между базой вашего измерения и временем начала.Затем вы можете вычесть длительности:

    Duration relativeStart = parseDuration("20:28");
    Duration relativeStop = parseDuration("20:18");
    Duration duration = relativeStop.minus(relativeStart);
    System.out.println(duration.getSeconds());

Я использую этот вспомогательный метод:

private static Duration parseDuration(String timeString) {
    String isoTimeString = timeString.replaceFirst("(\\d{2}):(\\d{2})", "PT$1M$2S");
    return Duration.parse(isoTimeString);
}

Поскольку Duration.parse может анализировать только строку в формате ISO 8601, например PT20M28SЯ использую регулярное выражение для преобразования вашей строки в этот формат.

Вывод такой же, как и раньше.

2 голосов
/ 18 сентября 2019
    LocalTime start = LocalTime.parse( "00:20:28" );
    LocalTime stop = LocalTime.parse( "00:20:18" );
    Duration duration = Duration.between( start, stop );
    System.out.println(duration.getSeconds());

Вы сохраняете дату неправильно.Вы также должны предоставить час.когда вы передаете параметр 2 (20:18), его считают первым часом, а минутой.вот почему его возвращают 600 секунд.600 сек равен 10 минутам.какая разница во времени между вашими обоими параметрами.

2 голосов
/ 18 сентября 2019

Поскольку LocalTime, по-видимому, не может использовать шаблон DateTimeFormatter с mm:ss, вы также можете создать короткий вспомогательный метод static, который вызывается вместо этого.

Этот метод устанавливает час по умолчанию для всех разборов в одно и то же значение, что не раскрывает "00:" где-либо еще, что может быть подвержено ошибкам, если случайно введен другой час.

Это обеспечит точность любого Duration.between() в течение минут и секунд:

public static void main(String [] args) {
    LocalTime start = parseHelper("20:28");
    LocalTime stop = parseHelper("20:18");
    Duration duration = Duration.between(start, stop);
    System.out.println(duration.getSeconds());
}

private static LocalTime parseHelper(String str) {
    return LocalTime.parse("00:" + str);
}

Вывод:

-10

РЕДАКТИРОВАТЬ:

Вот некоторые документы , которые подтверждают, что hours не являются обязательными в LocalTime, и, видимо, не являютсяminutes.

Здесь вы видите список возможных значений в методе toString().

Выходными данными будет один из следующих форматов ISO-8601:

HH:mm
HH:mm:ss
HH:mm:ss.SSS
HH:mm:ss.SSSSSS
HH:mm:ss.SSSSSSSS
0 голосов
/ 18 сентября 2019

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

LocalTime start = LocalTime.parse("00:20:28");
LocalTime stop = LocalTime.parse("00:20:18");
Duration duration = Duration.between( start, stop );
System.out.println(duration.getSeconds());

Вывод: -10

Другой возможный подход заключается в использовании метода of с часом по умолчанию:

LocalTime start = LocalTime.of(0, 20, 28);
LocalTime stop = LocalTime.of(0, 20, 18);
Duration duration = Duration.between( start, stop );
System.out.println(duration.getSeconds());

Выход: -10

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