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!

Другие вопросы по тегам