Haskell: время доступа к файлу в формате "гггг-мм-дд"
Я совершенно заблудился во всех разных библиотеках даты и времени, доступных для меня в Хаскеле. Я пытаюсь отформатировать время изменения файла как "гггг-мм-дд". Может кто-нибудь показать мне, как это сделать?
У меня есть этот фрагмент кода:
main = do
times <- mapM getModificationTime $ dataFiles config -- dataFiles returns [FilePath].
-- I'd like to do something like the following:
(putStr . unlines . map formatDate) times
Это то, что я пытался. Пожалуйста, не смейтесь!
formatDate t =
let (year, month, day) = toGregorian $ utctDay t
in intercalate "-" $ map show [year, fromIntegral month, fromIntegral day]
Я знаю, что это не совсем соответствует моим спецификациям, потому что месяцы и дни не будут заполнены нулями. Я могу это исправить. Но я полагаю, что есть более элегантный способ получить то, что мне нужно, именно поэтому я назвал свой пост тем, что я ищу, а не текущей ошибкой, которую я получаю, что для полноты картины Couldn't match expected type 'UTCTime' with actual type 'ClockTime'
,
Спасибо за любую помощь, которую вы можете дать или ясность, которую вы можете предоставить.
2 ответа
Как то так должно конвертировать ClockTime
в UTCTime
:
import System.Time
import Data.Time.Clock.POSIX
utcTimeFromClockTime :: ClockTime -> UTCTime
utcTimeFromClockTime (TOD seconds picoseconds)
= posixSecondsToUTCTime . fromRational
$ fromInteger seconds + fromInteger picoseconds / 1000000000000
Вы, вероятно, хотите преобразовать это, чтобы использовать ваш местный часовой пояс. использование utcToLocalZonedTime :: UTCTime -> IO ZonedTime
из Data.Time.LocalTime.
В любом случае, у вас есть временная метка, которую вы можете отформатировать:
import Data.Time.Format
import System.Locale
formatIsoDate :: FormatTime t => t -> String
formatIsoDate = formatTime defaultTimeLocale "%F"
(Извините, я не проверял ни один из этого кода.)
Вот один из подходов:
λ> :m + Data.Time
λ> :m + System.Locale
λ> t <- getModificationTime "amy.hs"
λ> formatTime defaultTimeLocale "%Y-%m-%d" t
"2013-05-14"
Вам понадобится old-locale
пакет. Несмотря на название, это, насколько я знаю, текущее. Здесь нет new-locale
или же locale
!