Haskell中如何基于起止日期生成按周间隔的日期序列
Haskell按周间隔生成日期列表实现
我们可以直接使用Haskell官方标准的time库完成需求,无需引入额外第三方依赖,实现逻辑简洁高效:
完整实现代码
-- 导入日期处理核心模块 import Data.Time (Day, parseTimeM, defaultTimeLocale, addDays, formatTime) -- 输入的日期字符串定义 startDateStr :: String startDateStr = "2020-01-01" endDateStr :: String endDateStr = "2021-01-01" -- ISO标准日期字符串转Day类型,确认输入格式合法时可直接使用,生产环境可补充错误处理逻辑 parseIsoDate :: String -> Day parseIsoDate = parseTimeM True defaultTimeLocale "%Y-%m-%d" -- 解析后的日期类型变量 startDate :: Day startDate = parseIsoDate startDateStr endDate :: Day endDate = parseIsoDate endDateStr -- 生成按周间隔的日期序列 weeklyDateList :: [Day] weeklyDateList = takeWhile (<= endDate) $ iterate (addDays 7) startDate -- 转为目标字符串格式的最终结果 result :: [String] result = map (formatTime defaultTimeLocale "%Y-%m-%d") weeklyDateList
逻辑说明
- 首先把字符串格式的起止日期转为
Day类型,方便做日期运算 - 用
iterate (addDays 7) startDate生成从起始日期开始、每次加7天的无限日期序列 - 用
takeWhile (<= endDate)截取所有不晚于结束日期的元素,刚好覆盖到2021-01-01为止 - 最后把
Day类型统一格式化为YYYY-MM-DD格式的字符串,完全匹配需求的输出样式
如果你需要处理日期解析可能失败的场景,可以把parseIsoDate的返回值改为Maybe Day或者Either String Day类型,增加异常捕获逻辑适配生产环境。
内容的提问来源于stack exchange,提问作者Jivan
相关产品推荐
相关产品推荐

