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
Я могу получитьUTCTime
.СutcTimeToPOSIXSeconds
Я могу получить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)
Мой вопрос
Есть ли лучший / более простой способ конвертировать время? (возможно, используя разные библиотеки)