Haskell以ISO8601字符串形式获取当前时间

k10s72fa  于 2022-11-14  发布在  其他
关注(0)|答案(4)|浏览(264)

我已经尝试了几种可以在网上找到的方法来将当前时间打印为ISO8601字符串,但是没有一种方法有效:

  1. This SO answer假设您已经知道如何获取当前时间,但我无法理解。
    我不断得到一个错误Could not find module ‘System.Locale’,因为它似乎System.Localedeprecated/not installed by default anymore
    我试着安装old-local,但它给了我新的错误,我想是由于timeold-locale之间的不兼容造成的:
• Couldn't match expected type ‘time-1.9.3:Data.Time.Format.Locale.TimeLocale’
              with actual type ‘System.Locale.TimeLocale’
  NB: ‘time-1.9.3:Data.Time.Format.Locale.TimeLocale’
        is defined in ‘Data.Time.Format.Locale’ in package ‘time-1.9.3’
      ‘System.Locale.TimeLocale’
        is defined in ‘System.Locale’ in package ‘old-locale-1.0.0.7’
• In the first argument of ‘formatTime’, namely ‘defaultTimeLocale’
  In the expression: formatTime defaultTimeLocale "%FT%T%QZ"
  In an equation for ‘iso8601’:
      iso8601 = formatTime defaultTimeLocale "%FT%T%QZ"
   |
49 | iso8601 = formatTime defaultTimeLocale "%FT%T%QZ"
   |                      ^^^^^^^^^^^^^^^^^
  1. This wiki page获取当前时间,但不将其格式化为ISO8601。
  2. this blog post看起来真的很好,但是只有一个关于格式的部分,实际上和1.:
Prelude Data.Time> formatTime defaultTimeLocale "%T, %F (%Z)" myTime

我想要的,是能够调用一个函数,让它打印出当前时间作为一个ISO8601字符串。我猜这将不得不实际上是一个IO操作,因为它不是一个严格的函数。

u91tlkcl

u91tlkcl1#

我想知道time包的Data.Time.Format.ISO8601模块中的一些东西是否会有帮助?iso8601Show函数将UTCTime转换为ISO8601格式的字符串。

import Data.Time (getCurrentTime)
import Data.Time.Format.ISO8601 (iso8601Show)

main :: IO ()
main = do
  now <- getCurrentTime
  putStrLn (iso8601Show now)

和在GHCI中:

>>> import Data.Time (getCurrentTime)
>>> import Data.Time.Format.ISO8601 (iso8601Show)
>>> now <- getCurrentTime
>>> putStrLn (iso8601Show now)
2022-09-09T08:06:21.630747Z
b1uwtaje

b1uwtaje2#

您可以通过执行函子Map来稍微改善这一点:

import Data.Time.Format (defaultTimeLocale, formatTime)
import Data.Time.Clock(getCurrentTime)

getCurrentTimeAsISO8601 :: IO String
getCurrentTimeAsISO8601 = take 23 . formatTime defaultTimeLocale "%F %T%Q" <$> getCurrentTime
deyfvvtc

deyfvvtc3#

我想我知道了。注意Haskell有funky string formatting time specifications

  • %F ==年-月-日
  • %T ==时:分:秒
  • %Q ==.最多12位小数(秒的小数部分)
import Data.Time.Format (defaultTimeLocale, formatTime)
import Data.Time.Clock

getCurrentTimeAsISO8601 :: IO String
getCurrentTimeAsISO8601 = do
  t <- getCurrentTime
  let val = formatTime defaultTimeLocale "%F %T%Q" t
  -- Take the first 23 characters so we don't get the microseconds
  return $ take 23 val

main = do
  time <- getCurrentTimeAsISO8601
  putStrLn time

你可以使用在线的ghcihere复制粘贴代码,它应该都工作。

eeq64g8w

eeq64g8w4#

UTC的show示例是您需要的,因此您可以使用show。

getCurrentTimeASISO8601 :: IO String
getCurrentTimeASISO8601 = fmap (take 23 . show) getCurrentTime

只需注意:据我所知,ISO8601不是yyyy-MM-dd hh:mm:ss而是yyyy-MM-ddThh:mm:ss,所以如果你是根据这个标准来实现的,请检查两次。

相关问题