Haskell:文件访问时间格式化"yyyy-MM-dd"



我在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'

这里有一个方法:

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

您将需要old-locale包。除了名字之外,据我所知,这是目前的一个。没有new-localelocale !

这样做应该会将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 from Data.Time.LocalTime.

无论哪种方式,您都可以格式化时间戳:

import Data.Time.Format
import System.Locale
formatIsoDate :: FormatTime t => t -> String
formatIsoDate = formatTime defaultTimeLocale "%F"

(对不起,我没有测试过任何代码)

相关内容

  • 没有找到相关文章

最新更新