如何使用Carbon获取两个日期之间的所有月份
当然可以用Carbon实现这个功能!
Carbon是PHP原生DateTime类的增强扩展,完全兼容原生日期操作的同时,还提供了更简洁、可读性更高的API。针对你给出的原生实现,我们可以用Carbon更优雅地完成同样的工作,下面是两种实现方式:
方式一:使用Carbon专属方法(推荐)
利用Carbon提供的便捷方法替代原生的modify调用,代码逻辑更直观:
use Carbon\Carbon; use Carbon\CarbonPeriod; // 初始化起始日期,并设置为当月第一天 $start = Carbon::parse('2018-06-01')->firstOfMonth(); // 初始化结束日期,并设置为下一个月的第一天(对应原代码的逻辑) $end = Carbon::parse('2019-06-01')->firstOfNextMonth(); // 使用CarbonPeriod创建日期区间(Carbon对DatePeriod的扩展) $period = CarbonPeriod::create($start, '1 month', $end); foreach ($period as $dt) { echo $dt->format("Y-m") . "<br>\n"; }
方式二:直接替换原生DateTime为Carbon
因为Carbon继承自DateTime,所以你可以直接把原代码中的new DateTime替换为Carbon实例,代码几乎不需要改动就能运行:
use Carbon\Carbon; $start = (new Carbon('2018-06-01'))->modify('first day of this month'); $end = (new Carbon('2019-06-01'))->modify('first day of next month'); $interval = DateInterval::createFromDateString('1 month'); $period = new DatePeriod($start, $interval, $end); foreach ($period as $dt) { echo $dt->format("Y-m") . "<br>\n"; }
两种方式都能得到和原代码完全一致的输出,但第一种方式借助Carbon的专属方法(比如firstOfMonth()、firstOfNextMonth())让代码逻辑更清晰,也避免了字符串格式的modify调用可能带来的歧义。
内容的提问来源于stack exchange,提问作者user8517929
相关产品推荐
相关产品推荐

