获取 2 个日期之间的所有月份

2023-12-25

我创建了一个函数,它返回一个包含每个月的数组,从提供的碳日期开始到当前日期结束。

虽然这个函数正在做它应该做的事情,但它看起来很丑陋。显然我的编程技能还没有达到应有的水平。当然必须有更好的方法来实现我想要的。

我的代码如下所示:

    class DateUtilities {
    protected $months = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december'];

    public function getMonthListFromDate(Carbon $date)
    {
        $monthArray = array();
        $today = Carbon::today();

        $currentYear = $today->copy()->format('Y');
        $currentMonth = strtolower($today->copy()->format('F'));

        $startYear = $date->copy()->format('Y');
        $startMonth = strtolower($date->copy()->format('F'));

        for($i = $startYear; $i <= $currentYear; $i ++) {
            foreach($this->months as $monthIndex => $month) {
                if (($monthIndex >= array_search($startMonth, $this->months) && $i == $startYear) ||
                    ($monthIndex <= array_search($currentMonth, $this->months) && $i == $currentYear) ||
                    ($i != $startYear && $i != $currentYear)) {
                    $formattedMonthIndex = ($monthIndex + 1);

                    if($formattedMonthIndex < 10) {
                        $monthArray['0' . $formattedMonthIndex . '-' . $i] = $month . ' ' . $i;
                    } else {
                        $monthArray[$formattedMonthIndex . '-' . $i] = $month . ' ' . $i;
                    }
                }
            }
        }

        return $monthArray;
    }
}

结果是:

array:25 [▼
  "03-2013" => "march 2013"
  "04-2013" => "april 2013"
  "05-2013" => "may 2013"
  "06-2013" => "june 2013"
  "07-2013" => "july 2013"
  "08-2013" => "august 2013"
  "09-2013" => "september 2013"
  "10-2013" => "october 2013"
  "11-2013" => "november 2013"
  "12-2013" => "december 2013"
  "01-2014" => "january 2014"
  "02-2014" => "february 2014"
  "03-2014" => "march 2014"
  "04-2014" => "april 2014"
  "05-2014" => "may 2014"
  "06-2014" => "june 2014"
  "07-2014" => "july 2014"
  "08-2014" => "august 2014"
  "09-2014" => "september 2014"
  "10-2014" => "october 2014"
  "11-2014" => "november 2014"
  "12-2014" => "december 2014"
  "01-2015" => "january 2015"
  "02-2015" => "february 2015"
  "03-2015" => "march 2015"
]

谁能帮我改进这段代码?

EDIT:

在获得了这些很棒的建议之后,我最终得到了以下结论:

class DateUtilities {

public function getMonthListFromDate(Carbon $start)
{
    $start = $start->startOfMonth();
    $end   = Carbon::today()->startOfMonth();

    do
    {
        $months[$start->format('m-Y')] = $start->format('F Y');
    } while ($start->addMonth() <= $end);

    return $months;
}

}

谢谢各位的帮助!!


虽然来晚了,但值得补充的是,Carbon 已经涵盖了这一点。使用 CarbonPeriod 会将整个班级减少到......

use Carbon\Carbon;
use Carbon\CarbonPeriod;

class DateUtilities
{
    public function getMonthListFromDate(Carbon $start)
    {
        $start->setDay(1);
        foreach (CarbonPeriod::create($start, '1 month', Carbon::today()) as $month) {
            $months[$month->format('m-Y')] = $month->format('F Y');
        }
        return $months;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取 2 个日期之间的所有月份 的相关文章

随机推荐

  • frisby 的 Get 方法不适用于 https

    我是弗里斯比测试的新手 今天发现无法访问https ip https ip来自 friby api 的地址 例如 frisby create my test get https 199 59 148 20 output connect er
  • Eclipse/MySQL 集成插件? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 我的顺风滚动 snap x 无法工作,您能找到解决方案吗?

    所以我使用 Tailwind CSS 但遇到了问题 所以我正在学习如何在顺风 CSS 上进行滚动捕捉 滚动对齐 y 有效 但滚动对齐 x 不起作用 我尝试了一切让我的代码滚动 snap x 但它不起作用 你们中的任何人都可以修复我的顺风代码
  • 霍夫变换 C# 代码 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 让我们看一下这个 C 实现 https github com andrewkirillov AForge NET blob a9453
  • iOS 中自定义 UIStatusBar

    有没有办法自定义UIStatusBar class 有关可以使用状态栏 或围绕状态栏 执行的操作的示例 请查看此 Github 项目 https github com myell0w MTStatusBarOverlay https git
  • 枚举构造函数(创建成员的成员)

    在 D 中 我试图创建一个成员有成员的枚举 我可以通过一个例子更好地解释我想要做什么 其中s and i代表我试图创建的子成员 在Python中 我可以这样做 class Foo enum Enum A A string 0 B B str
  • 在 VSCode 中禁用 Javascript 的特定错误消息?

    我在 JavaScript 中使用类属性 静态和普通 和装饰器 有没有办法启用其他 ES 阶段的代码突出显示或禁用它们的特定错误消息 VSCode 告诉我只能在 TypeScript 中使用类属性 因此它似乎可以识别它们 您可以使用以下命令
  • 如何给java足够的时间给变量赋值? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有一个循环 在循环的末尾有一个String 被添加到ArrayList 在类中声明而不是方法 并在循环开始时说Stri
  • 如何发出数据流已完成的信号?

    我有一个类 它使用 TPL 数据流实现由 3 个步骤组成的数据流 在构造函数中 我将步骤创建为 TransformBlocks 并使用 LinkTo 将它们链接起来 并将 DataflowLinkOptions PropagateCompl
  • 在 PHP 7.4 中使用 FFI 加载库时出现问题

    我在新的 FFI 中使用 PHP 中的第三方 so 库时遇到问题 当我运行这段小代码时
  • 如何获取asp.net下拉列表的选定值并将其存储在会话变量中?

    Dim ename As String DropDownList SelectedItem Value 这个声明不起作用 任何帮助表示赞赏 我不确定这是否是您的问题 但如果您正在寻找所需的项目文本 而不是值 DropDownList Sel
  • 使用 Jquery 从第一个下拉列表中过滤第二个下拉列表

    Team 我有两个下拉菜单说 年 和 节 1 年份下拉菜单将有以下选项 显示全部 1 2 3 4 2 部分下拉菜单将有以下选项 所有部分 1 部分 A 1 部分 B 1 部分 C 2 部分 A 2 部分 B 3 部分 A 4 部分 A 4
  • 强制用户在 iOS 中以编程方式更新应用程序

    在我的 iOS 应用程序中 我启用了强制应用程序更新功能 是这样的 如果有严重的错误修复 在服务器中我们正在设置新的发行版本 在启动屏幕中 我正在检查当前的应用程序版本 如果它低于服务版本 则会显示一条更新应用程序的消息 我放置了 2 个按
  • Spring RestTemplate - 需要释放连接吗?

    这是我的 Rest 模板配置 Bean Qualifier myRestService public RestTemplate createRestTemplate Value connection timeout String maxCo
  • 为什么不可能构建一个可以确定 C++ 函数是否会更改特定变量值的编译器?

    我在一本书上读到这样一句话 事实证明 构建一个可以实际执行的编译器是不可能的 确定 C 函数是否会更改 a 的值 特定变量 该段落讨论了为什么编译器在检查常量性时是保守的 为什么不可能构建这样的编译器 编译器始终可以检查变量是否被重新分配
  • 使用java从cassandra读取数据

    My sample cassandra table looks like id article read last hours name 5 4 5 6 5 shashank 10 12 88 32 1 sam 8 4 5 6 8 aman
  • 更改 Chart.js 工具提示中的日期格式

    我正在使用 Chart js 生成图表 一切正常 但是如何格式化工具提示信息呢 应该是 2020年4月28日 05 00 你需要定义time tooltipFormat https www chartjs org docs latest a
  • 如何从 NSArray 中的每个 NSDictionary 获取特定键的所有值? [复制]

    这个问题在这里已经有答案了 我有一个包含字典对象的数组 每个字典中的键都是通用的 现在我想获取该键的所有值 我已经通过迭代获得了这些值 但我正在寻找一些直接的方法或完成这项工作的默认方法 您能帮助我获得一种可以达到目的的默认方法吗 谢谢 数
  • 跨浏览器另存为.txt

    是否有一个 JavaScript 库允许将字符串保存为 txt 文件 并且可以跨浏览器工作 过去 我一直在使用 Downloadify 但出于以下几个原因 我正在考虑另一个选择 我希望找到一个纯JavaScript的解决方案 而不需要Fla
  • 获取 2 个日期之间的所有月份

    我创建了一个函数 它返回一个包含每个月的数组 从提供的碳日期开始到当前日期结束 虽然这个函数正在做它应该做的事情 但它看起来很丑陋 显然我的编程技能还没有达到应有的水平 当然必须有更好的方法来实现我想要的 我的代码如下所示 class Da