文章目录
- 计算出两个日期之间的月份
- 计算出两个日期之间的月份区间
- 计算两个日期之间的天数, 月数, 年数
- php 函数把 两个时间段之间的年 都返回到一个数组中
- 返回的数组如果每个key, 都包含开始时间和结束时间呢
计算出两个日期之间的月份
/**
* 计算出两个日期之间的月份
* @param [type] $start_date [开始日期,如2014-03]
* @param [type] $end_date [结束日期,如2015-12]
* @param string $explode [年份和月份之间分隔符,此例为 - ]
* @param boolean $addOne [算取完之后最后是否加一月,用于算取时间戳用]
* @return [type] [返回是两个月份之间所有月份字符串]
*/
function dateMonths($start_date,$end_date,$explode='-',$addOne=false){
//判断两个时间是不是需要调换顺序
$start_int = strtotime($start_date);
$end_int = strtotime($end_date);
if($start_int > $end_int){
$tmp = $start_date;
$start_date = $end_date;
$end_date = $tmp;
}
//结束时间月份+1,如果是13则为新年的一月份
$start_arr = explode($explode,$start_date);
$start_year = intval($start_arr[0]);
$start_month = intval($start_arr[1]);
$end_arr = explode($explode,$end_date);
$end_year = intval($end_arr[0]);
$end_month = intval($end_arr[1]);
$data = array();
$data[] = $start_date;
$tmp_month = $start_month;
$tmp_year = $start_year;
//如果起止不相等,一直循环
while (!(($tmp_month == $end_month) && ($tmp_year == $end_year))) {
$tmp_month ++;
//超过十二月份,到新年的一月份
if($tmp_month > 12){
$tmp_month = 1;
$tmp_year++;
}
$data[] = $tmp_year.$explode.str_pad($tmp_month,2,'0',STR_PAD_LEFT);
}
if($addOne == true){
$tmp_month ++;
//超过十二月份,到新年的一月份
if($tmp_month > 12){
$tmp_month = 1;
$tmp_year++;
}
$data[] = $tmp_year.$explode.str_pad($tmp_month,2,'0',STR_PAD_LEFT);
}
return $data;
}
array(3) {
["months"] => int(12)
["years"] => int(1)
["days"] => int(365)
}
计算出两个日期之间的月份区间
/**
* 计算出两个日期之间的月份区间
* @param [type] $start_date [开始日期,如2014-03]
* @param [type] $end_date [结束日期,如2015-12]
* @param string $explode [年份和月份之间分隔符,此例为 - ]
* @param boolean $addOne [算取完之后最后是否加一月,用于算取时间戳用]
* @return [type] [返回是两个月份之间所有月份字符串]
*/
function dateMonthsSections($start_date,$end_date,$explode='-',$addOne=false){
$data = dateMonths($start_date,$end_date,$explode,$addOne);
$length = sizeof($data);
$res = array();
foreach ($data as $key => $value) {
if($key < ($length)){
$date1 = $value;
$date2 = $data[$key + 1];
$res[$key][0] = date('Y-m-d', strtotime($date1));
$res[$key][1] = $date2 ? date('Y-m-d', strtotime($date2)) : $end_date;
}
}
return $res;
}
array(7) {
[0] => array(2) {
[0] => string(10) "2022-08-25"
[1] => string(10) "2022-09-01"
}
[1] => array(2) {
[0] => string(10) "2022-09-01"
[1] => string(10) "2022-10-01"
}
[2] => array(2) {
[0] => string(10) "2022-10-01"
[1] => string(10) "2022-11-01"
}
[3] => array(2) {
[0] => string(10) "2022-11-01"
[1] => string(10) "2022-12-01"
}
[4] => array(2) {
[0] => string(10) "2022-12-01"
[1] => string(10) "2023-01-01"
}
[5] => array(2) {
[0] => string(10) "2023-01-01"
[1] => string(10) "2023-02-01"
}
[6] => array(2) {
[0] => string(10) "2023-02-01"
[1] => string(10) "2023-02-21"
}
}
计算两个日期之间的天数, 月数, 年数
// 计算两个日期之间的天数, 月数, 年数
function countDuration($start, $end) {
$startDate = new DateTime($start);
$endDate = new DateTime($end);
$diff = $startDate->diff($endDate);
$years = $diff->y;
$months = $diff->m;
$days = $diff->d;
$totalMonths = ($years * 12) + $months;
$result = array(
'months' => $totalMonths,
'years' => $years,
'days' => $diff->days
);
return $result;
}
array(13) {
[0] => string(10) "2022-02-21"
[1] => string(7) "2022-03"
[2] => string(7) "2022-04"
[3] => string(7) "2022-05"
[4] => string(7) "2022-06"
[5] => string(7) "2022-07"
[6] => string(7) "2022-08"
[7] => string(7) "2022-09"
[8] => string(7) "2022-10"
[9] => string(7) "2022-11"
[10] => string(7) "2022-12"
[11] => string(7) "2023-01"
[12] => string(7) "2023-02"
}
php 函数把 两个时间段之间的年 都返回到一个数组中
function getYearsBetween($startDate, $endDate) {
$startYear = (new DateTime($startDate))->format('Y');
$endYear = (new DateTime($endDate))->format('Y');
$years = [];
$interval = DateInterval::createFromDateString('1 year');
$period = new DatePeriod(new DateTime("$startYear-01-01"), $interval, new DateTime("$endYear-12-31"));
foreach ($period as $date) {
$years[] = $date->format('Y');
}
return $years;
}
// 使用示例
$startDate = '2022-01-01';
$endDate = '2023-12-31';
$years = getYearsBetween($startDate, $endDate);
print_r($years);
这个函数将 $startDate 和 $endDate 参数传递给 DateTime 对象,然后获取开始和结束时间段的年份。使用 DatePeriod 类来创建一个包含开始年份和结束年份之间的所有年份的时间段,并将每个年份添加到数组中。最后返回年份数组。
在上面的示例中,如果 endDate 是 2023-12-31,那么输出的年份数组将是 [2022, 2023]。
返回的数组如果每个key, 都包含开始时间和结束时间呢
// 计算两个时间段之间的所有年份
function getYearsBetweenTwoDates($startDate, $endDate)
{
$result = array();
$startYear = date('Y', strtotime($startDate));
$endYear = date('Y', strtotime($endDate));
for ($i = $startYear; $i <= $endYear; $i++) {
if ($i == $startYear) {
$result[$i][0] = $startDate;
$result[$i][1] = date('Y-m-d 23:59:59', strtotime("$i-12-31"));
} elseif ($i == $endYear) {
$result[$i][0] = date('Y-m-d', strtotime("$i-01-01"));
$result[$i][1] = $endDate;
} else {
$result[$i][0] = date('Y-m-d', strtotime("$i-01-01"));
$result[$i][1] = date('Y-m-d 23:59:59', strtotime("$i-12-31"));
}
}
return $result;
}
输出结果将会是这样的:
Array
(
[2020] => Array
(
[start] => 2020-06-01
[end] => 2020-12-31
)
[2021] => Array
(
[start] => 2021-01-01
[end] => 2021-12-31
)
[2022] => Array
(
[start] => 2022-01-01
[end] => 2022-12-31
)
[2023] => Array
(
[start] => 2023-01-01
[end] => 2023-01-31
)
)
在这个例子中,每个年份都有一个起始时间和结束时间,分别对应每年的1月1日和12月31日。注意最后一个年份2023的结束时间是1月31日,因为时间段的结束日期是2023-01-01,所以它属于2023年。