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