如何从数字中获取 PHP 中一个月中的特定日期?

How can I get a specific day of the month in PHP from a number?

基本上,我的日期定在今天。从那个日期开始,我想获得该月的下一个和上一个 20 日。基本上,从 07/10/2020(d/m/Y 格式的 post 的日期开始),我应该以 date/timestamp 到 20/09/2020(前 20 日)和 20 /10/2020(下个20号).

我尝试了一些事情,结果是:

$ld_next_str = date("d/m/Y", strtotime("20 day this month"));
$ld_next_dt = DateTime::createFromFormat("d/m/Y", $ld_next_str);

$ld_prev_str = date("d/m/Y", strtotime("20 day last month"));
$ld_prev_dt = DateTime::createFromFormat("d/m/Y", $ld_prev_str);

但事实证明:"20 day this month" 只是在当前日期上增加了 20 天,所以现在(7 号)是 returns 27 号。

知道这一点后,我想我可以做一些事情,比如用当天减去那个日期 (27 - 7 = 20),但我觉得可能有更简单的方法,使用 strtotime没有任何额外的步骤。

提前致谢!

PS :我知道您可以使用“第一”/“第二”/“第三”等获得一些日子...但是(我认为)它不会比“第十二”更高,因为我试过“twentieth”但没有用...

简单地说:

$lastM = date("20/m/Y", strtotime("-1 month"));
$thisM = date("20/m/Y", time());
$nextM = date("20/m/Y", strtotime("+1 month"));

echo "$lastM <br /> $thisM <br /> $nextM";

前20的公式为:

mktime(0, 0, 0, $month - (1 - floor($day / 20)), 20, $year))

下一个20的公式是:

mktime(0, 0, 0, $month + floor($day / 20), 20, $year))

作为演示:

for ($month = 1; $month <= 12; $month++) {
    for ($day = 1; $day <= 30; $day += 5) {
        $prev = mktime(0, 0, 0, $month - (1 - floor($day / 20)), 20, 2020);
        $next = mktime(0, 0, 0, $month + floor($day / 20), 20, 2020);
        echo "$day/$month/2020: ", date('d/m/Y', $prev), ', ', date('d/m/Y', $next), PHP_EOL;
    }
}

输出:

1/1/2020: 20/12/2019, 20/01/2020
6/1/2020: 20/12/2019, 20/01/2020
11/1/2020: 20/12/2019, 20/01/2020
16/1/2020: 20/12/2019, 20/01/2020
21/1/2020: 20/01/2020, 20/02/2020
26/1/2020: 20/01/2020, 20/02/2020
1/2/2020: 20/01/2020, 20/02/2020
6/2/2020: 20/01/2020, 20/02/2020
11/2/2020: 20/01/2020, 20/02/2020
16/2/2020: 20/01/2020, 20/02/2020
21/2/2020: 20/02/2020, 20/03/2020
...

具有支持 cron 语法的外部 class(DateTime 扩展)的解决方案。

字符串“0 0 20 * *”指定每个月的 20 日和每个工作日 00:00。 nextCron() 和 previousCron() 方法用于根据特定日期确定 previous/next 时间点。

$cronStr = "0 0 20 * *";  //every 20th 00:00

//source on https://github.com/jspit-de/dt
$next20 = dt::create('now')->nextCron($cronStr);
echo $next20;  //2020-10-20 00:00:00

$prev20 = dt::create('now')->previousCron($cronStr);
echo $prev20;  //2020-09-20 00:00:00

2020 年 10 月 8 日执行的输出。