我在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-locale
和locale
!
这样做应该会将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"
(对不起,我没有测试过任何代码)