如何从数字中获取 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 日执行的输出。
基本上,我的日期定在今天。从那个日期开始,我想获得该月的下一个和上一个 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 日执行的输出。