ファイルの変更時刻を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)
私の質問は
時間を変換するためのより良い/より簡単な方法はありますか?(多分異なるライブラリを使用しています)