Skip to content

Instantly share code, notes, and snippets.

@imbyc
Last active July 26, 2023 05:49
Show Gist options
  • Save imbyc/2cf40078f979c7e9786139736042e885 to your computer and use it in GitHub Desktop.
Save imbyc/2cf40078f979c7e9786139736042e885 to your computer and use it in GitHub Desktop.
[PHP 生成指定日期范围内的所有日期(支持生成数组或生成器两种方式)]

image

测试代码:

// 示例:使用生成器方式输出日期
$start_date = '2023-02-25';
$end_date = '2999-03-01';

// 记录初始内存使用量
$memory_before_generator = memory_get_usage();

$dates_generator = generate_dates_between($start_date, $end_date, true);

foreach ($dates_generator as $date) {
    // 在这里处理每个日期,例如输出或其他操作
    //echo $date . PHP_EOL;
}

// 记录生成器示例执行后的内存使用量
$memory_after_generator = memory_get_usage();
$memory_usage_generator = $memory_after_generator - $memory_before_generator;
echo "内存消耗(使用生成器方式):" . round($memory_usage_generator / 1024 / 1024, 2) . "M" . PHP_EOL;
echo "内存消耗(使用生成器方式):" . $memory_usage_generator . " bytes" . PHP_EOL;

// 示例:使用数组方式输出日期

// 记录初始内存使用量
$memory_before_array = memory_get_usage();

$dates_array = generate_dates_between($start_date, $end_date, false);

//print_r($dates_array);
// 记录数组示例执行后的内存使用量
$memory_after_array = memory_get_usage();
$memory_usage_array = $memory_after_array - $memory_before_array;
echo "内存消耗(使用数组方式):" . round($memory_usage_array / 1024 / 1024, 2) . "M" . PHP_EOL;
echo "内存消耗(使用数组方式):" . $memory_usage_array . " bytes" . PHP_EOL;

测试结果:

内存消耗(使用生成器方式):0M
内存消耗(使用生成器方式):1544 bytes
内存消耗(使用数组方式):105.03M
内存消耗(使用数组方式):110133840 bytes

<?php
/**
* 生成指定日期范围内的所有日期(支持生成数组或生成器两种方式)。
*
* @param string $start_date 起始日期,格式为 'Y-m-d',例如 '2023-07-25'。
* @param string $end_date 结束日期,格式为 'Y-m-d',例如 '2023-08-01'。
* @param bool $use_generator 是否使用生成器方式,默认为 false。
*
* @return array|\Generator
* @throws \Exception
*/
function generate_dates_between($start_date, $end_date, bool $use_generator = false)
{
$current_date = new \DateTime($start_date);
$end_date = new \DateTime($end_date);
$interval = new \DateInterval('P1D');
if ($use_generator) {
return (function () use ($current_date, $end_date, $interval) {
while ($current_date <= $end_date) {
yield $current_date->format('Y-m-d');
$current_date->add($interval);
}
})();
} else {
return (function () use ($current_date, $end_date, $interval) {
$dates = array();
while ($current_date <= $end_date) {
$dates[] = $current_date->format('Y-m-d');
$current_date->add($interval);
}
return $dates;
})();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment