php - 在php中获取财政年度的日期范围
问题描述
当我通过年份并返回每年开始和结束的日期范围时,如何在 PHP 中获得财政年度日期范围,如下所示。
像例如。
Input Array = [2017,2018]
Financial Start Month = 04
输出数组 =
[
'2017' => [
'start' => '2016-04-01',
'end' => '2017-03-31'
],
'2018' => [
'start' => '2017-04-01',
'end' => '2018-03-31'
]
]
我的努力:-
$year_arr = [2017,2018];
$fn_month = 04;
$date_range_arr = [];
foreach ($year_arr as $key => $value) {
$fn_start_date_year = ($value - 1);
$fn_start_date_month = $fn_month;
$fn_start_date_day = '01';
$fn_start_date_string = $fn_start_date_year.'-'.$fn_start_date_month.'-'.$fn_start_date_day;
$start_date = date('Y-m-d',strtotime($fn_start_date_string));
$fn_end_date_year = ($value);
$fn_end_date_month = (fn_month == 1)?12:(fn_month-1);
$fn_end_date_day = date('t',strtotime($fn_end_date_year.'-'.$fn_end_date_month.'-01'));
$fn_start_date_string = $fn_end_date_year.'-'.$fn_end_date_month.'-'.$fn_end_date_day;
$end_date = date('Y-m-d',strtotime($fn_start_date_string));
$date_range_arr[$value] = [
'start_date' => $start_date,
'end_date' => $end_date
];
}
以上是我的努力。它运行良好,但需要更健壮的代码。
解决方案
在 PHP 中操作日期的一个好方法是使用DateTime
类。这是一个如何使用它获得所需结果的示例。通过使用该modify
方法,我们可以避免对闰年等并发症的担忧(参见下面的 2016 年结果)。
$year_arr = [2016,2017,2018];
$fn_month = 03;
foreach ($year_arr as $year) {
$end_date = new DateTime($year . '-' . $fn_month . '-01');
$start_date = clone $end_date;
$start_date->modify('-1 year');
$end_date->modify('-1 day');
$date_range_arr[$year] = array('start_date' => $start_date->format('Y-m-d'),
'end_date' => $end_date->format('Y-m-d'));
}
print_r($date_range_arr);
输出:
Array (
[2016] => Array (
[start_date] => 2015-03-01
[end_date] => 2016-02-29
)
[2017] => Array (
[start_date] => 2016-03-01
[end_date] => 2017-02-28
)
[2018] => Array (
[start_date] => 2017-03-01
[end_date] => 2018-02-28
)
)
推荐阅读
- python - Python将mysql提取到csv
- nginx - Varnish High Availability 是否有免费的模拟(nginx、haproxy、varnish config for HA)?
- android - 向视图添加一些文本
- android - 如何获取 Oreo 中正在运行的应用程序列表?
- django - 如何保护在 django 中创建的目录,以便只有 django 应用程序可以访问它
- google-cloud-datalab - Google Cloud Datalab 未运行单元格:文件夹创建和保存以及检查点失败
- wso2 - 在 wso2 api 管理器中进行身份验证后的重定向
- php - Prestashop 1.6 - 从 TPL 按钮调用函数
- javascript - 从处理子域但不处理ajax请求的子域传递php会话
- electron - 64位windows电子js的命令代码是什么?