【问题标题】:date() : First monday of first week of month?date() : 每月第一周的第一个星期一?
【发布时间】:2019-08-12 15:21:12
【问题描述】:

我实际上是在尝试制作一个带有“邮票”界面的月度奖励系统。 为此,我想使用一个包含 1 个单元格 = 1 天的 HTML 表格,从星期一开始。

这是我的问题(解决方案可能很容易找到!):星期一不是一个月的第一天 - 至少不是整个月。如何要求 strtotime() 和 date() 显示日期 Y-m-d :

  • “每月第一周的星期一”?

  • “每月最后一周的星期日”?

我期待 2019-08 年的结果是这样的:

  • 2019-07-29

  • 2019-09-01

我没有在 PHP 文档中找到它,但是有没有办法在 date() 上放置第三个参数来设置日期?

这样,我可以做这样的事情:

date('Y-m-d', strtotime('monday'), '2019-08-01');

编辑:

根据@Vidal 的回答,这是我尝试过的,但我得到了一个奇怪的 PHP 反应:

$first_date = date("Y-m-d", strtotime("first monday 2019-08 - 7 days"));
$last_date = date("Y-m-d", strtotime("last sunday 2019-09"));
$last_date2 = date("Y-m-d", strtotime("last sunday 2019-09 + 7 days"));
echo $first_date; ?><br>
echo $last_date; ?><br>
echo $last_date2; ?><br>

输出:

2019-07-29
2019-08-25
2019-09-08

我不知道为什么。您是否还注意到我需要将 $last_date & $last_date2 设置为 2019-09 而不是 2019-08 ?

【问题讨论】:

  • 毫无意义,7-29 不在 8 月,9-01 不在 8 月。那怎么可能是 08 月? 7-29 是 7 月的最后一个星期一,也恰好是 7 月的最后一周。
  • 请看我更新的答案last sunday of 2019-08
  • 此外,如果您想获得每月的下周一和周日,则必须增加 1 个月而不是 7 天。
  • 如果您遇到这样的问题,为什么不自己编写某种算法呢?这样做应该不会太难,而且学习一些 TDD 看起来是一个很好的练习
  • @p。 Jerome 我的解决方案对你有用吗?

标签: php


【解决方案1】:

我认为最好使用 DateTime 对象。

/* 
I'm expecting result like this for 2019-08 :
"monday of first week of month" => 2019-07-29
"sunday of last week of month" => 2019-09-01
*/
$month = "2019-08";
$date = date_create($month."-02")
  ->modify("last Monday")
  ->format('l, d-m-Y')
;
echo $date."<br>";

$date = date_create("last Day of ".$month)
  ->modify("-1 Day")
  ->modify("next Sunday")
  ->format('l, d-m-Y')
;
echo $date."<br>";

/* Output
Monday, 29-07-2019
Sunday, 01-09-2019
*/

【讨论】:

  • 最好从 OP 那里获得反馈,但我认为这将在 10 月份失败,例如。但这是一个好方法,只需使用“第一天”和“本周星期一/星期日”。无需更改日期。
【解决方案2】:

对年、月进行循环。

echo date("j, d-M-Y", strtotime("first monday of 2019-08"));
echo date("j, d-M-Y", strtotime("last sunday of 2019-08"));      

希望对你有帮助。

PHP Reference

【讨论】:

    【解决方案3】:

    我设法通过更改您的代码来使其工作:

    1) 如果第一个星期一 > 2 并且

    2) 我在另一行代码中添加了“+ 7 天”。如果我有“XXXX-XX 的最后一个星期日 + 7 天”,它就不起作用

    3) 为了根据您想要的输出获得最后一个星期日,我将本月的最后一个星期日与该月的总天数 - 7 进行了比较。如果大于(例如 25),则意味着这不是最后一个星期天

    $year = 2019;
    $month = 8;
    
    if($month < 10)
        $month = "0" . $month;
    $currentDate = $year . "-" . $month;
    
    if(date("d", strtotime("first monday of " . $currentDate)) > 2 && date("d", strtotime("first monday of " . $currentDate)) <= 7) 
        $first_date = date("Y-m-d", strtotime("first monday of " . $currentDate . " -7 days"));
    else
        $first_date = date("Y-m-d", strtotime("first monday of " . $currentDate));
    if(date("d",strtotime("last sunday of " . $currentDate)) > date('t') - 7)
    {
        $last_date = date("Y-m-d", strtotime("last sunday of " . $currentDate));
        $last_date = date("Y-m-d",strtotime($last_date . " +7 days")); //working when you add days like that. doesn't work if I put + 7 days in the 'last sunday of'...
    }
    else
        $last_date = date("Y-m-d", strtotime("last sunday of " . $currentDate));
    echo $first_date . "<br>";
    echo $last_date . "<br>";
    

    【讨论】:

      猜你喜欢
      • 2021-08-21
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      • 2019-12-01
      • 1970-01-01
      相关资源
      最近更新 更多