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

Haskell:文件访问时间格式化;yyyy-MM-dd“;,haskell,datetime-format,lastaccesstime,Haskell,Datetime Format,Lastaccesstime,我在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

我在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
我知道它还没有完全达到我的规格,因为我不会让数月或数天的时间都被零填满。我可以解决这个问题。但我认为有一种更优雅的方式来获取我所追求的,这就是为什么我用我所追求的而不是我所得到的当前错误来命名我的文章,为了完整起见,
无法将预期类型“UTCTime”与实际类型“ClockTime”匹配。

感谢您提供的任何帮助或清晰的说明。

这里有一种方法:

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

您将需要
旧区域设置
包。尽管有名字,但据我所知,这是目前的名字。没有
新区域设置
区域设置

类似的内容应该将
时钟时间
转换为
UTCTime

import System.Time
import Data.Time.Clock.POSIX

utcTimeFromClockTime :: ClockTime -> UTCTime
utcTimeFromClockTime (TOD seconds picoseconds)
   = posixSecondsToUTCTime . fromRational
        $ fromInteger seconds + fromInteger picoseconds / 1000000000000
您可能希望将其转换为使用本地时区。从Data.Time.LocalTime使用
utcToLocalZonedTime::UTCTime->IO ZonedTime

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

import Data.Time.Format
import System.Locale

formatIsoDate :: FormatTime t => t -> String
formatIsoDate = formatTime defaultTimeLocale "%F"

(很抱歉,我没有测试任何代码。)

您能澄清一下ghci为
getModificationTime
报告的类型吗?(在ghci中,运行
:m+System.Directory
,然后运行
:t getModificationTime
)其类型最近似乎已从
文件路径->IO时钟时间
更改为
文件路径->IO UTCTime
。在我的系统上,ghci显示
getModificationTime::FilePath->IO System.Time.ClockTime
。但是,是的,我在网上看到它返回
ioutctime
。也许这是我的部分问题。喜欢lambda提示!由于使用“FormatTime”,我没有得到(Data.Time.Format.FormatTime System.Time.ClockTime)的实例。。通过这段代码,我得到了以下两个我自己无法理解的错误:
无法将“(+)”的第一个参数中的预期类型“Rational”与实际类型“Integer”匹配,即“秒”。
无法在“do”块的stmt中将预期类型“IO t0”与实际类型“UTCTime->IO TimeZone”匹配:TimeZone@JeffManer抱歉。我已经在我的答案中编辑了代码,希望它现在能工作。明白了!非常感谢你。尝试使用utcToLocalZonedTime时出错--但我不需要时间,所以我没有使用它。再次感谢!
import Data.Time.Format
import System.Locale

formatIsoDate :: FormatTime t => t -> String
formatIsoDate = formatTime defaultTimeLocale "%F"