Вот мой подход к этой проблеме. Сначала я создал две вспомогательные функции, одна из которых извлекает дату окончания из имени файла, а другая - файловую систему modified
время. Я не думаю, что нужно проверять время created
, поскольку всегда созданное время меньше или равно измененному времени даты.
Функция, которая извлекает дату окончания имени файла:
private LocalDate getEndDate(File file) {
String fileName = file.getName();
String fileNameWithoutExtension = fileName.substring(0, fileName.lastIndexOf("."));
String[] fileNameChunks = fileNameWithoutExtension.split("_");
String endDateAsString = fileNameChunks[fileNameChunks.length - 1];
return LocalDate.parse(endDateAsString, DateTimeFormatter.ofPattern("yyyyMMdd"));
}
Далее, функция, которая извлекает файловую систему modified
для файла. Для этого я использую Files#getLastModifiedTime
для получения даты modified
:
private LocalDate getLastModifiedDate(File file, ZoneId zoneId) {
try {
return ZonedDateTime
.ofInstant(Files.getLastModifiedTime(file.toPath()).toInstant(), zoneId)
.toLocalDate();
} catch (IOException e) {
throw new RuntimeException("Could not read file attributes: " + file.getAbsolutePath());
}
}
В конце концов, это просто вызов этих функций и выполнение проверок:
boolean isTodaysFile(File file) {
Clock systemUTCClock = Clock.systemUTC();
LocalDate localDateNow = LocalDate.now(systemUTCClock);
LocalDate fileEndDate = getEndDate(file);
// first check - validate that the file name's end date is today
if (!fileEndDate.isEqual(localDateNow)) {
return false;
}
LocalDate lastModifiedDate = getLastModifiedDate(file, systemUTCClock.getZone());
// second check - validate that the modified that is today
// no need to check the creation date, since creation date is always less or equal to the last modified date
return lastModifiedDate.equals(localDateNow);
}
Я использую Clock.systemUTC()
и создаю для него все даты, чтобы убедиться, что мы всегда используем UT C.
-
LocalDate.now(systemUTCClock)
systemUTCClock.getZone()
Если входные файлы в каталоге:
ABC_STOCK_List_20200220_20200220.csv
ABC_STOCK_List_20200219_20200219.csv
ABC_STOCK_List_20200218_20200218.csv
ABC_STOCK_List_20200217_20200217.csv
ABC_STOCK_List_20200305_20200305.csv
На дату написания этой записи текущая дата 03-05-2020 . Выходной файл при вызове findLatestFile
:
ABC_STOCK_List_20200217_20200305.csv
Примечания:
- Я не выполнял никаких проверок формата имени файла. Если что-то не так с форматом, вы можете получить некоторые ошибки при получении даты окончания.