Ale*_*sky 24 formatting haskell date
我一直在使用Haskell的Date.Time模块来解析像12-4-1999或的日期1-31-1999.我试过了:
parseDay :: String -> Day
parseDay s = readTime defaultTimeLocale "%m%d%Y" s
Run Code Online (Sandbox Code Playgroud)
而且我认为我希望我的几个月和几天只有两位数而不是一两位数......
这样做的正确方法是什么?
另外,我想以这种格式打印出我的日子:12/4/1999Haskell的方式是什么?
谢谢您的帮助.
Tim*_*rry 54
您可以使用Data.Time.Format中的函数读取日期.我在下面包含了一个简单的程序,它以一种格式读取日期,并以两种不同的格式写出该日期.要以一位数或几天的数字读取,请在%和格式说明符之间放置一个连字符( - ).换句话说,要解析格式为9-9-2012的日期,请在%和格式字符之间包含一个连字符.因此,要解析"9-9-2012",您需要格式字符串"%-d - % - m-%Y".
注意:考虑到Haskell软件包的发展速度,这个答案有点长.可能是时候寻找更好的解决方案了.我不再编写Haskell所以如果其他人创建了另一个答案会更好,因为这个问题在Google搜索结果中排名很高.
截至2017年7月,以下代码使用现已弃用的parseTime.建议您立即使用parseTimeOrError.代码变成:
import Data.Time
main =
do
let dateString = "26 Jan 2012 10:54 AM"
let timeFromString = parseTimeOrError True defaultTimeLocale "%d %b %Y %l:%M %p" dateString :: UTCTime
-- Format YYYY/MM/DD HH:MM
print $ formatTime defaultTimeLocale "%Y/%m/%d %H:%M" timeFromString
-- Format MM/DD/YYYY hh:MM AM/PM
print $ formatTime defaultTimeLocale "%m/%d/%Y %I:%M %p" timeFromString
-- now for a string with single digit months and days:
let dateString = "9-8-2012 10:54 AM"
let timeFromString = parseTimeOrError True defaultTimeLocale "%-d-%-m-%Y %l:%M %p" dateString :: UTCTime
-- Format YYYY/MM/DD HH:MM
print $ formatTime defaultTimeLocale "%Y/%m/%d %H:%M" timeFromString
Run Code Online (Sandbox Code Playgroud)
.cabal文件中的版本:build-depends:base> = 4.9 && <4.10,time> = 1.6.0.1
截至2014年8月,语言环境最好从"System.Locale"包而不是Haskell 1998"Locale"包中获得.考虑到这一点,上面的示例代码现在为:
import System.Locale
import Data.Time
import Data.Time.Format
main =
do
let dateString = "26 Jan 2012 10:54 AM"
let timeFromString = readTime defaultTimeLocale "%d %b %Y %l:%M %p" dateString :: UTCTime
-- Format YYYY/MM/DD HH:MM
print $ formatTime defaultTimeLocale "%Y/%m/%d %H:%M" timeFromString
-- Format MM/DD/YYYY hh:MM AM/PM
print $ formatTime defaultTimeLocale "%m/%d/%Y %I:%M %p" timeFromString
-- now for a string with single digit months and days:
let dateString = "9-8-2012 10:54 AM"
let timeFromString = readTime defaultTimeLocale "%-d-%-m-%Y %l:%M %p" dateString :: UTCTime
-- Format YYYY/MM/DD HH:MM
print $ formatTime defaultTimeLocale "%Y/%m/%d %H:%M" timeFromString
Run Code Online (Sandbox Code Playgroud)
输出现在看起来像这样:
"2012/01/26 10:54"
"01/26/2012 10:54 AM"
"2012/08/09 10:54"
Run Code Online (Sandbox Code Playgroud)
**原创,2012年1月**答案:
import Locale
import Data.Time
import Data.Time.Format
main =
do
let dateString = "26 Jan 2012 10:54 AM"
let timeFromString = readTime defaultTimeLocale "%d %b %Y %l:%M %p" dateString :: UTCTime
-- Format YYYY/MM/DD HH:MM
print $ formatTime defaultTimeLocale "%Y/%m/%d %H:%M" timeFromString
-- Format MM/DD/YYYY hh:MM AM/PM
print $ formatTime defaultTimeLocale "%m/%d/%Y %I:%M %p" timeFromString
Run Code Online (Sandbox Code Playgroud)
输出如下所示:
"2012/01/26 10:54"
"01/26/2012 10:54 AM"
Run Code Online (Sandbox Code Playgroud)
Data.Time.Format可从"time"包中获得.如果您需要解析单个数字的月或日,换句话说,如9-9-2012之类的日期,则在%和格式字符之间包含一个连字符.因此,要解析"9-9-2012",您需要格式字符串"%-d - % - m-%Y".
小智 13
使用%-d和%-m而不是%d和%m表示单个数字日/月是正常的,即
parseDay :: String -> Day
parseDay s = readTime defaultTimeLocale "%-m%-d%Y" s
Run Code Online (Sandbox Code Playgroud)
这可能是sclv的意思,但他的评论对我来说有点过于神秘.
fra*_*ser -5
这是一些旧代码,其中包含两种类型的自制日期,仅包含 YMD 的日期,没有时间或时区等。
它展示了如何使用将字符串解析为日期readDec。查看parseDate函数。使用readDec,读取数字,前导空格(因为 )或前导零并不重要filter,并且解析在第一个非数字处停止。然后用于tail(跳过非数字)到达日期的下一个数字字段。
它显示了几种格式化输出的方法,但最灵活的方法是使用Text.printf. 看instance Show LtDate。有了printf,一切皆有可能!
import Char
import Numeric
import Data.Time.Calendar
import Data.Time.Clock
import Text.Printf
-- ================================================================
-- LtDate
-- ================================================================
type Date=(Int,Int,Int)
data LtDate = LtDate
{ ltYear :: Int,
ltMonth:: Int,
ltDay :: Int
}
instance Show LtDate
where show d = printf "%4d-%02d-%02d" (ltYear d) (ltMonth d) (ltDay d)
toLtDate :: Date -> LtDate
toLtDate (y,m,d)= LtDate y m d
-- =============================================================
-- Date
-- =============================================================
-- | Parse a String mm/dd/yy into tuple (y,m,d)
-- accepted formats
--
-- @
-- 12\/01\/2004
-- 12\/ 1\' 4
-- 12-01-99
-- @
parseDate :: String -> Date
parseDate s = (y,m,d)
where [(m,rest) ] = readDec (filter (not . isSpace) s)
[(d,rest1)] = readDec (tail rest)
[(y, _) ] = parseDate' rest1
-- | parse the various year formats used by Quicken dates
parseDate':: String -> [(Int,String)]
parseDate' (y:ys) =
let [(iy,rest)] = readDec ys
year=case y of '\'' -> iy + 2000
_ ->
if iy < 1900 then iy + 1900 else iy
in [(year,rest)]
-- | Note some functions sort by this format
-- | So be careful when changing it.
showDate::(Int, Int, Int) -> String
showDate (y,m,d)= yy ++ '-':mm ++ '-':dd
where dd=zpad (show d)
mm = zpad (show m)
yy = show y
zpad ds@(_:ds')
| ds'==[] = '0':ds
| otherwise = ds
-- | from LtDate to Date
fromLtDate :: LtDate -> Date
fromLtDate lt = (ltYear lt, ltMonth lt, ltDay lt)
Run Code Online (Sandbox Code Playgroud)
一旦获得 (Y,M,D),就可以轻松转换为 Haskell 库类型以进行数据操作。使用完 HS 库后,Text.printf可用于设置显示日期的格式。