Data.Convertible аккуратный. Если вы столкнулись с проблемой зависимости: cabal install convertible --reinstall

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

Чтобы узнать время от exif, я нашел:

Graphics.Exif.getTag :: Exif -> String -> IO (Maybe String)

Чтобы установить время изменения файла, я нашел:

System.Posix.Files.setFileTimes :: FilePath -> EpochTime -> EpochTime -> IO ()

Предполагая, что я нахожу Time в Exif, мне нужно преобразовать String в EpochTime.

СparseTime Я могу получитьUTCTimeutcTimeToPOSIXSeconds Я могу получитьPOSIXTimeСPOSIXTime Я могу более или менее получитьEpochTime

Преобразовать изUTCTime вEpochTime это проверка типов, но я не уверен, что это правильно:

fromIntegral . fromEnum . utcTimeToPOSIXSeconds $ etime

Это часть функции getTime, которая будет возвращать время из данных Exif, если оно есть, в противном случае время изменения файла:

getTime (path,stat) = do
 let ftime                 = modificationTime $ stat
     err (SomeException _) = return ftime
 time <- liftIO $ handle err $ do
   exif <- Exif.fromFile path
   let getExifTime = MaybeT . liftIO . Exif.getTag exif
   res <- runMaybeT $ do
     tmp <- msum . map getExifTime $ [ "DateTimeOriginal","DateTimeDigitized", "DateTime" ]
     MaybeT . return . parseTime defaultTimeLocale "%Y:%m:%d %H:%M:%S" $ tmp
   case res of
     Nothing    -> return ftime
     Just etime -> return . fromIntegral . fromEnum . utcTimeToPOSIXSeconds $ etime
 return (path,time)

Мой вопрос

Есть ли лучший / более простой способ конвертировать время? (возможно, используя разные библиотеки)

Ответы на вопрос(2)

Ваш ответ на вопрос