Конвертация FileTime в LocalDateDime

Во время обучения на базовом курсе Java столкнулся с проблемой Java, которую на лекции анонсировал лектор – это работа с датами и временем. Несмотря на то, что в java имеется множество классов для работы с датой и временем, тем не менее большинство этих классов работают только со своими форматами. Такое положение дел серьезно осложняет работу над проектами и создает предпосылки для труднодиагностируемых ошибок.

Выход из этой ситуации я вижу в разработке методов – помощников, позволяющих конвертировать различные форматы дат и времени. Например, такой популярный атрибут файла, как LastModifiedTime, получаемый одноименным методом Files.getLastModifiedTime(path), возвращает дату в формате FileTime. Какой класс работает с этим форматом? Как обработать данные в таком формате? А если необходимо этот атрибут в файле изменить?

Столкнувшись с этой проблемой, я решил разработать класс, позволяющий конвертировать FileTime в LocalDateTime и обратно. При конвертации используются настройки операционной системы по умолчанию, но при желании этот код можно легко изменить под локальную задачу. Предлагаю вашему вниманию свое решение:

public class FileDateTimeChange {
    static public LocalDateTime readDateTime(Path path) {
        //метод читает дату и время обновления файла по path
        //и конвертирует ее в LocalDateTime
        //с учетом настроек операционной системы по умолчанию
        try {
            LocalDateTime datetime = Files.getLastModifiedTime(path)
                    .toInstant()
                    .atZone(ZoneId.systemDefault())
                    .toLocalDateTime();

            return datetime;
        } catch (IOException e) {
            return null;
        }
    }

    static public FileTime convertLocalDateTime(LocalDateTime dateTime) {
        //метод конвертирует LocalDateTime dateTime в формат FileTime
        ZoneId systemZone = ZoneId.systemDefault();
        ZoneOffset zoneOffset = systemZone.getRules().getOffset(dateTime);
        Instant instant = dateTime.toInstant(zoneOffset);
        FileTime fileTime = FileTime.from(instant);

        return fileTime;
    }
}

Андрей Кадыров, после окончания базового курса, июль 2020