gpt4 book ai didi

php - 优化 mysql 日期生成器?

转载 作者:行者123 更新时间:2023-11-29 02:31:50 29 4
gpt4 key购买 nike

我有一个函数接受 ($year, $month = null, $day = null)

基本上年总是要传入的,但是月和日是可选的。
如果它们未传入,则将范围设置为最大可能。

所以:调用 |结果

(2012, 08, 15) | ['2012-08-15', '2012-08-15']  
(2012, 08) | ['2012-08-01', '2012-08-31']
(2012, 02) | ['2012-02-01', '2012-02-29']
(2012) | ['2012-01-01', '2012-12-31']
() | false

我有下面的代码,但对我来说它似乎不必要地复杂,谁能想到更好的版本?

if (!is_null($year)) {

//year
$from = $year . '-';
$to = $year . '-';

//month
if (!is_null($month)) {
$from .= sprintf('%02d', $month) . '-';
$to .= sprintf('%02d', $month) . '-';

//day
if (!is_null($day)) {
$from .= sprintf('%02d', $day);
$to .= sprintf('%02d', $day);
} else {
$from .= '01';
$to .= sprintf('%02d', cal_days_in_month(CAL_GREGORIAN, $month, $year));
}

} else {
$from .= '01-31';
$to .= '12-31';
}
return array($from, $to);
}
return false;

最佳答案

首先我会稍微改变一下设计,以便使用起来更容易:

function my_func_your_func_date_func($year, $month = null, $day = null)
{
if (NULL === $year)
return false;

$mask = '%04d-%02d-%02d';
$from = vsprintf($mask, date_pad_first($year, $month, $day));
$to = vsprintf($mask, date_pad_last($year, $month, $day));

return array($from, $to);
}

然后是这些辅助函数:

function date_pad_first($year, $month = NULL, $day = NULL)
{
if (NULL === $month)
$month = 1;

if (NULL === $day)
$day = 1;

return array($year, $month, $day);
}

function date_pad_last($year, $month = NULL, $day = NULL)
{
if (NULL === $month)
$month = 12;

if (NULL === $day)
$day = cal_days_in_month(CAL_GREGORIAN, $month, $year);

return array($year, $month, $day);
}

然后我可能想提取这两个看起来非常相似的函数之间的差异并对其进行参数化,但我不确定。


如果您更喜欢将它放在一个函数中(并且如果 $month 未设置,则重置 $day 的语义略有不同),这需要分支一个if:

function my_func_your_func_date_func($year, $month = null, $day = null)
{
if (NULL === $year)
return false;

$from[-1] = $year;
$to = $from;

if (NULL === $month) {
$from += [1, 1];
$to += [12, 31];
} else {
$from[2] += [$month, 1];
$to[2] += [$month, cal_days_in_month(CAL_GREGORIAN, $month, $year)];
}

$mask = '%04d-%02d-%02d';
return array(
vsprintf($mask, $from),
vsprintf($mask, $to)
);
}

如果时间上有一个 12 月少于或多于 31 天,此功能也将不起作用。

关于php - 优化 mysql 日期生成器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11967066/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com