You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Erlang中遍历{2017,9,14}至{2018,5,1}的每日日期?

Erlang日期范围遍历的最优实现

嘿,这个问题其实用Erlang标准库就能完美解决,不用自己折腾日期计算的细节——毕竟处理闰年、不同月份天数这些坑太容易出错了。下面是最优的实现思路和代码:

核心思路

利用calendar模块的两个关键函数:

  • calendar:date_to_gregorian_days/1:把{Year, Month, Day}转成连续的儒略日整数
  • calendar:gregorian_days_to_date/1:把儒略日转回到日期元组

通过把日期转成整数,我们就能用lists:seq/2轻松生成整个范围内的所有日期对应的整数,再转回去输出就行,逻辑简单又高效。

完整代码实现

-module(date_walker).
-export([print_date_range/2]).

print_date_range(StartDate, EndDate) ->
    % 转成儒略日,把日期变成连续整数
    StartGregorian = calendar:date_to_gregorian_days(StartDate),
    EndGregorian = calendar:date_to_gregorian_days(EndDate),
    % 遍历每个儒略日,转成日期并输出
    lists:foreach(fun(GregorianDay) ->
                          Date = calendar:gregorian_days_to_date(GregorianDay),
                          io:format("~p ", [Date])
                  end, lists:seq(StartGregorian, EndGregorian)).

使用方式

直接调用模块函数,传入你的起始和结束日期:

date_walker:print_date_range({2017, 9, 14}, {2018, 5, 1}).

为什么这是最优实现?

  • 依赖标准库:calendar模块是Erlang官方维护的,经过大量测试,能正确处理所有边界情况(比如2018年的2月只有28天、跨年度的月份切换等),不用自己写复杂的日期判断逻辑。
  • 效率拉满:lists:seq/2生成连续整数是Erlang内部优化过的操作,遍历和转换的时间复杂度是O(N)(N是日期范围的天数),这是遍历类问题的理论最优复杂度。
  • 代码简洁易维护:整个逻辑清晰,没有冗余代码,后续如果要修改输出格式或者做其他处理,只需要调整foreach里的逻辑就行。

内容的提问来源于stack exchange,提问作者Jon Riel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:37:12