¿Hay una mejor manera de convertir UTCTime a EpochTime?
Quiero establecer el tiempo de modificación de un archivo al tiempo que obtuve de los datos exif.
Para obtener el tiempo de exif, encontré:
Graphics.Exif.getTag :: Exif -> String -> IO (Maybe String)
Para establecer el tiempo de modificación del archivo, encontré:
System.Posix.Files.setFileTimes :: FilePath -> EpochTime -> EpochTime -> IO ()
Suponiendo que encuentre un tiempo en Exif, necesito convertir una cadena en un tiempo de época.
ConparseTime
Puedo conseguir unUTCTime
.ConutcTimeToPOSIXSeconds
Puedo conseguir unPOSIXTime
Con unPOSIXTime
Puedo obtener más o menos unEpochTime
Para convertir de unUTCTime
aEpochTime
este tipo comprueba, pero no estoy seguro de que sea correcto:
fromIntegral . fromEnum . utcTimeToPOSIXSeconds $ etime
Esto es parte de una función getTime que devolverá el tiempo de los datos Exif, si está presente, de lo contrario, el tiempo de modificación del archivo:
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)
Mi pregunta es
¿Hay una manera mejor / más simple de convertir el tiempo? (tal vez usando diferentes bibliotecas)