文章目录

  • 计算出两个日期之间的月份
  • 计算出两个日期之间的月份区间
  • 计算两个日期之间的天数, 月数, 年数
  • 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 类来创建一个包含开始年份和结束年份之间的所有年份的时间段,并将每个年份添加到数组中。最后返回年份数组。

在上面的示例中,如果 mysql 计算两个日期的年数 mysql计算两个日期的月份_时间段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年。