【问题标题】:How can I get a specific day of the month in PHP from a number?如何从数字中获取 PHP 中的特定日期?
【发布时间】:2020-10-07 07:29:52
【问题描述】:

基本上,我将日期设置为今天。从那个日期开始,我想得到该月的下一个和上一个 20 天。基本上,从 07/10/2020(d/m/Y 格式的帖子日期)开始,我应该以 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 天,所以现在(在第七天)它返回 27 号。

知道了这一点,我想我可能只是做一些事情,比如将当前日期减去那个日期 (27 - 7 = 20),但我觉得可能有一种更简单的方法可以做到这一点,使用 strtotime 而无需任何额外步骤.

提前致谢!

PS:我知道您可以使用“第一”/“第二”/“第三”等来获得一些日子......但是(我认为)它不会高于“第十二”,因为我尝试了“第二十” ",但没有奏效......

【问题讨论】:

  • 如果您从 25/10/2020 开始,您想要 20/10/2020 和 20/11/2020...?如果您从 20/10/2020 开始呢?
  • 为什么不使用获取本月和上月的日期,然后将日期设置为 20 ?

标签: php date datetime strtotime


【解决方案1】:

前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
...

【讨论】:

  • 解决方案对于 20 日非常特殊,很遗憾不能用于 2 日等其他日子。
  • @jspit 没错,您需要找到适用于其他日期的公式。事实上,当你从 20 日开始时,它应该如何表现有点不确定......我将把它留给读者来具体实现他们的案例。但这说明了一种安全的方法,这是 strtotime 等人无法真正做到的。
【解决方案2】:

简单地说:

$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";

【讨论】:

  • “-1 个月”的计算从来都不是安全的。如果是 3 月 30 日,您将得到 3 月 1 日,而不是 2 月底。你不能以任何方式依赖它。
  • 确实是您正确的-1 个月。为了适应他需要将实际日期设置为 15,例如:$dat = strtotime(date("Y/m/15", strtotime("2020/02/01"))); $lastM = date("20/m/Y", strtotime("-1 month", $dat)); $nextM = date("20/m/Y", strtotime("+1 month", $dat));
【解决方案3】:

使用支持cron 语法的外部类(DateTime 扩展)的解决方案。

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

$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 日执行的输出。

【讨论】:

    猜你喜欢
    • 2018-06-11
    • 2023-03-27
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    相关资源
    最近更新 更多