java.time
Чтобы вычислить разницу между временами в двух путях:
String onePath = "command_step_output/2019/02/13/ea768d46-85bb-4833-8326-fb6be6d60a89_20190213_105228_command_step_output.csv.gz";
String anotherPath = "command_step_output/2019/02/13/ea768d46-85bb-4833-8326-fb6be6d60a89_20190213_105325_command_step_output.csv.gz";
LocalDateTime oneTime = extractDateTime(onePath);
LocalDateTime anboherTime = extractDateTime(anotherPath);
Duration diff = Duration.between(oneTime, anboherTime);
diff = diff.abs();
Вызов abs
в последней строке преобразует любую отрицательную разницу в положительнуюодин, убедившись, что буфер меньше на 1 минуту и на 1 минуту больше.extractDateTime
внизу этого ответа.Чтобы узнать, составляет ли разница менее минуты, есть разные способы, и я хотел бы показать вам несколько вариантов.Сначала просто:
if (diff.toMinutes() < 1) {
System.out.println("Within the window: " + diff);
}
Внутри окна: PT57S
Я напечатал разницу в сообщении, и это выглядит немного забавно.Формат - ISO 8601. Читайте как «период времени в 57 секунд».
Недостатком вышесказанного является то, что он работает только в течение целого числа минут.Что если однажды вы захотите изменить буфер, скажем, на 45 секунд или 1 минуту 30 секунд?Следующее является более общим:
Duration buffer = Duration.ofMinutes(1);
if (diff.compareTo(buffer) < 0) {
System.out.println("Within the window: " + diff);
}
Мне бы хотелось, чтобы Duration
имел метод isShorterThan
, но это не так.Если вам трудно прочитать код, используя compareTo
, вы не одиноки.Альтернатива - вычесть и посмотреть, если результат отрицательный:
if (diff.minus(buffer).isNegative()) {
System.out.println("Within the window: " + diff);
}
Я обещал вам код вспомогательного метода:
private static LocalDateTime extractDateTime(String path) {
String dateTimeString = path.replaceFirst("^.*/[0-9a-f-]+_(\\d+_\\d+)_command_step_output\\.csv\\.gz$", "$1");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuuMMdd_HHmmss");
return LocalDateTime.parse(dateTimeString, formatter);
}
Я использую replaceFirst
и обычныйвыражение для извлечения части 20190213_105228
.Затем выполните синтаксический анализ объекта в LocalDateTime
.
Ссылки