我想将文件的修改时间设置为从 exif 数据获取的时间。
为了从 exif 获取时间,我发现:
Graphics.Exif.getTag :: Exif -> String -> IO (Maybe String)
要设置文件修改时间,我发现:
System.Posix.Files.setFileTimes :: FilePath -> EpochTime -> EpochTime -> IO ()
假设我确实在 Exif 中找到了时间,我需要将字符串转换为 EpochTime。
- With
parseTime
我可以得到一个UTCTime
.
- With
utcTimeToPOSIXSeconds
我可以得到一个POSIXTime
- With a
POSIXTime
我或多或少可以得到一个EpochTime
要从UTCTime
to 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)
我的问题是
有没有更好/更简单的方法来转换时间? (也许使用不同的库)