【发布时间】:2011-05-10 19:25:42
【问题描述】:
我想将文件的修改时间设置为我从 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
要从 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)
我的问题是
有没有更好/更简单的方法来转换时间? (可能使用不同的库)
【问题讨论】: