Tôi muốn đặt thời gian sửa đổi của tệp cho thời gian tôi nhận được từ dữ liệu exif.Có cách nào tốt hơn để chuyển đổi từ UTCTime sang EpochTime?
Để có được thời gian từ exif, tôi thấy:
Graphics.Exif.getTag :: Exif -> String -> IO (Maybe String)
Để thiết lập thời gian sửa đổi tập tin, tôi thấy:
System.Posix.Files.setFileTimes :: FilePath -> EpochTime -> EpochTime -> IO()
Giả sử tôi không tìm thấy một Time in Exif, tôi cần phải chuyển đổi một chuỗi thành một EpochTime.
- Với
parseTime
Tôi có thể nhận đượcUTCTime
. - Với
utcTimeToPOSIXSeconds
tôi có thể có được mộtPOSIXTime
- Với
POSIXTime
tôi nhiều hơn hoặc ít hơn có thể nhận được mộtEpochTime
Để chuyển đổi từ một UTCTime
để EpochTime
typechecks này, nhưng tôi không chắn rằng nó là đúng:
fromIntegral . fromEnum . utcTimeToPOSIXSeconds $ etime
Đây là một phần của hàm getTime sẽ trả về thời gian từ Exif dữ liệu, nếu prese nt, nếu thời gian sửa đổi của tập tin:
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)
Câu hỏi của tôi là
Có/cách đơn giản hơn để chuyển đổi thời gian? (Có thể sử dụng libaries khác nhau)
tôi sao chép hình ảnh từ một hệ thống tập tin khác, sử dụng copyFile ngày của tập tin bị mất, vì vậy tôi cần phải đặt nó trở lại để phù hợp với thời điểm bức ảnh được chụp. –
@David V .: Vâng, điều đó sẽ làm được. 'System.Posix' nó là. – Yitz