Chcę ustawić czas modyfikacji pliku na czas, który otrzymałem z danych exif.Czy istnieje lepszy sposób na konwersję z UTCTime na EpochTime?
Aby uzyskać czas z EXIF, stwierdziliśmy:
Graphics.Exif.getTag :: Exif -> String -> IO (Maybe String)
Aby ustawić czas modyfikacji pliku, znalazłem:
System.Posix.Files.setFileTimes :: FilePath -> EpochTime -> EpochTime -> IO()
Zakładając robię znaleźć taki czas w Exif, muszę przekonwertuj ciąg na epochTime.
- Z
parseTime
mogę uzyskaćUTCTime
. - Z
utcTimeToPOSIXSeconds
mogę uzyskaćPOSIXTime
- dysponujący
POSIXTime
mogę bardziej lub mniej uzyskaćEpochTime
o przekonwertowaniu UTCTime
do EpochTime
tego typechecks, ale nie jestem pewien, że to poprawne:
fromIntegral . fromEnum . utcTimeToPOSIXSeconds $ etime
jest częścią getTime funkcji, które zwracają czas z Exif danych, jeśli prese nt, inaczej czas modyfikacji pliku:
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)
Moje pytanie brzmi
Czy istnieje lepszy/prostszy sposób przekonwertować czas? (Być może przy użyciu różnych bibliotekami)
mam kopiowania zdjęć z systemu plików do innego, używając CopyFile data pliku nie jest stracone, więc trzeba ustawić ją z powrotem w celu dopasowania do czasu wykonania zdjęcia. –
@ David V .: Tak, to zrobi. 'System.Posix' to jest. – Yitz