【问题标题】:Getting previous given weekday name获取先前给定的工作日名称
【发布时间】:2019-07-16 17:07:47
【问题描述】:

人们可以通过只使用当天的名称来获取一周中即将到来的第一天,而不是在前面加上“this”。

$dt=new \DateTime('7/16/2019');
echo $dt->format('l jS \of F Y h:i:s A').PHP_EOL;                               //Tuesday 16th of July 2019 12:00:00 AM

echo (clone $dt)->modify('monday')->format('l jS \of F Y h:i:s A').PHP_EOL;     //Monday 22nd of July 2019 12:00:00 AM
echo (clone $dt)->modify('tuesday')->format('l jS \of F Y h:i:s A').PHP_EOL;    //Tuesday 16th of July 2019 12:00:00 AM
echo (clone $dt)->modify('wednesday')->format('l jS \of F Y h:i:s A').PHP_EOL;  //Wednesday 17th of July 2019 12:00:00 AM

如何获得前一个工作日?例如,

  • 2019 年 7 月 15 日星期一 12:00:00 AM
  • 2019 年 7 月 16 日星期二 12:00:00 AM
  • 2019 年 7 月 10 日,星期三 12:00:00 AM

请注意,previous 将适用于除周二返回 Tuesday 9th of July 2019 12:00:00 AM 之外的所有人。

【问题讨论】:

  • 你不能只做previous x 并且在与$dt 的工作日相同的工作日没有之前吗?
  • 但是9号是前一个星期二。 2019 年 7 月 16 日是星期二。所以前一个星期二是 9 号。
  • @Kyle 我同意之前的做法应该做,但是,这不是我想要的。
  • 好吧,如果您对“前一天”的定义是“减少一天”,那么您为什么不考虑到这一点来简单地纠正它呢? 不要7/16/2019的前几天,而是先加一天……

标签: php date datetime


【解决方案1】:

试试这个:

$dt=new \DateTime('7/16/2019 00:01:00');
$dt->modify('monday');
echo $dt->format('l jS \of F Y h:i:s A').PHP_EOL;                               //Tuesday 16th of July 2019 12:00:00 AM
echo (clone $dt)->modify('previous monday')->format('l jS \of F Y h:i:s A').PHP_EOL;     //Monday 22nd of July 2019 12:00:00 AM
echo (clone $dt)->modify('previous tuesday')->format('l jS \of F Y h:i:s A').PHP_EOL;    //Tuesday 16th of July 2019 12:00:00 AM
echo (clone $dt)->modify('previous wednesday')->format('l jS \of F Y h:i:s A').PHP_EOL;

我将它设置为下周一,所以上一个总是返回你所期望的。

【讨论】:

    【解决方案2】:

    您可以使用包装函数来检查工作日与 DateTime 实例。如果工作日与实例相同,则只需返回实例的克隆。

    function getPreviousWeekday(DateTime $dt, string $weekday)
    {
        if (strtolower($dt->format('l')) == strtolower($weekday)) {
            return clone $dt;
        }
    
        return (clone $dt)->modify($weekday);   
    }
    

    那么用法应该是这样的:

    echo getPreviousWeekday($dt, 'monday')->format('l jS \of F Y h:i:s A').PHP_EOL; //Monday 22nd of July 2019 12:00:00 AM
    echo getPreviousWeekday($dt, 'tuesday')->format('l jS \of F Y h:i:s A').PHP_EOL; //Tuesday 16th of July 2019 12:00:00 AM
    echo getPreviousWeekday($dt, 'wednesday')->format('l jS \of F Y h:i:s A').PHP_EOL; //Wednesday 17th of July 2019 12:00:00 AM
    

    【讨论】:

      【解决方案3】:

      您可以使用strtotimelast <weekday> 来获得您想要的。根据您的用例,您可以尝试以明天为起点。

      $tomorrow = strtotime('tomorrow');
      
      $monday = date('l jS of F Y h:i:s A', strtotime('last monday', $tomorrow));
      $tuesday = date('l jS of F Y h:i:s A', strtotime('last tuesday', $tomorrow));
      $wednesday = date('l jS of F Y h:i:s A', strtotime('last wednesday', $tomorrow));
      
      echo $monday.PHP_EOL;
      echo $tuesday.PHP_EOL;
      echo $wednesday.PHP_EOL;
      

      这将返回:

      Monday 15th of July 2019 12:00:00 AM
      Tuesday 16th of July 2019 12:00:00 AM
      Wednesday 10th of July 2019 12:00:00 AM
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-21
        • 1970-01-01
        • 2014-08-10
        • 2015-03-29
        相关资源
        最近更新 更多