1

我在 Haskell 中可用的所有不同的日期和时间库中迷失了方向。我要做的是将文件修改时间格式化为“yyyy-MM-dd”。有人可以告诉我怎么做吗?

我有这个代码片段:

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'.

感谢您提供的任何帮助或您可以提供的清晰度。

4

2 回答 2

2

这是一种方法:

λ> :m + Data.Time
λ> :m + System.Locale
λ> t <- getModificationTime "amy.hs"
λ> formatTime defaultTimeLocale "%Y-%m-%d" t
"2013-05-14"

你需要这个old-locale包。尽管有这个名字,但据我所知,这是当前的。没有new-localelocale

于 2013-05-14T18:38:13.093 回答
1

像这样的东西应该将转换ClockTimeUTCTime

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"

(对不起,我没有测试过这段代码。)

于 2013-05-14T19:45:17.973 回答