Quiero establecer el tiempo de modificación de un archivo a la hora que obtuve de los datos exif.¿Existe alguna forma mejor de convertir de UTCTime a EpochTime?
para obtener el tiempo de Exif, que encontré:
Graphics.Exif.getTag :: Exif -> String -> IO (Maybe String)
Para ajustar la hora de modificación del archivo, que encontré:
System.Posix.Files.setFileTimes :: FilePath -> EpochTime -> EpochTime -> IO()
Suponiendo que encuentro una vez en Exif, necesito convertir una Cadena en un EpochTime.
- Con
parseTime
Puedo obtener unUTCTime
. - Con
utcTimeToPOSIXSeconds
puedo conseguir unPOSIXTime
- Con un
POSIXTime
puedo más o menos tener unaEpochTime
Para convertir de un UTCTime
a EpochTime
esta typechecks, pero no estoy seguro de que es correcta:
fromIntegral . fromEnum . utcTimeToPOSIXSeconds $ etime
Esto es parte de un getTime función que devolverá el tiempo desde Exif datos, si prese nt, de lo contrario la hora 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
¿Existe una manera mejor/más fácil de convertir el tiempo? (Tal vez usando diferentes librerias)
estoy copiando imágenes desde un sistema de archivos a otro, usando copyFile fecha del archivo se pierde, por lo que tenga que configurar de nuevo para que coincida con el tiempo se tomó la fotografía. –
@David V .: Sí, eso lo hará. 'System.Posix' es. – Yitz