【问题标题】:How to finding the number of days between two days of the week?如何找到一周中两天之间的天数?
【发布时间】:2018-04-20 00:11:05
【问题描述】:

如何使用 PHP 查找两天之间的天数不是日期

我知道如何获取两个日期之间的天数,但我的输入值是日期名称(不知道日期)。

输入/输出:

WednesdaySaturday 返回 3

SundayWednesday 返回 3

【问题讨论】:

    标签: php date dayofweek date-difference


    【解决方案1】:

    您的任务似乎根本不需要日期函数。一个简单的查找数组就足够了。

    1. 从结束日的整数中减去开始日的整数值。
    2. 如果差值为零或更小,则加 7 以始终返回正确的正数天数。

    代码:(Demo)

    function daysUntil($start, $end) {
        $lookup = [
            'Sunday' => 0,
            'Monday' => 1,
            'Tuesday' => 2,
            'Wednesday' => 3,
            'Thursday' => 4,
            'Friday' => 5,
            'Saturday' => 6
        ];
        $days = $lookup[$end] - $lookup[$start] + ($lookup[$end] <= $lookup[$start] ? 7 : 0);
        return "{$days} days from {$start} to {$end}\n";
    }
    
    echo daysUntil('Wednesday', 'Saturday');  // Thursday, Friday, Saturday
    echo daysUntil('Monday', 'Friday');       // Tuesday, Wednesday, Thursday, Friday
    echo daysUntil('Thursday', 'Thursday');   // [assumed next week]
    echo daysUntil('Friday', 'Monday');       // Saturday, Sunday, Monday
    echo daysUntil('Saturday', 'Sunday');     // Sunday
    echo daysUntil('Sunday', 'Saturday');     // Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
    echo daysUntil('Sunday', 'Wednesday');    // Monday, Tuesday, Wednesday
    

    输出:

    3 days from Wednesday to Saturday
    4 days from Monday to Friday
    7 days from Thursday to Thursday
    3 days from Friday to Monday
    1 days from Saturday to Sunday
    6 days from Sunday to Saturday
    3 days from Sunday to Wednesday
    

    或者您可以用 4 个函数调用替换查找数组并达到相同的结果:(Demo)

    function daysUntil($start, $end) {
        $days = date('w', strtotime($end)) - date('w', strtotime($start));
        $days += $days < 1 ? 7 : 0;
        return "{$days} days from {$start} to {$end}\n";
    }
    

    【讨论】:

    • 对,我测试了另一个答案,但给出了错误的结果
    • 我昨天也写了一篇,但你的很简单,谢谢
    • 乐于助人。 (请务必始终在您的问题中包含您的编码尝试——这将避免对您的问题投反对票)
    • 人们不理解并快速投反对票并将其作为重复的垃圾邮件
    • 这就是为什么尽可能提出最好的问题如此重要。为了未来的 SO 读者的利益,改进您的问题还为时不晚。如果您编辑您的问题以包含您失败的编码尝试,我会考虑对其进行投票。
    【解决方案2】:

    使用 PHP date_diff() 函数 (docs)。

    $datetime1 = date_create($date_1);
    $datetime2 = date_create($date_2);
    
    $interval = date_diff($datetime1, $datetime2);
    
    echo $interval->format('%d'); // For days
    

    根据澄清,您可以创建任意周六和周三来计算它:

    $datetime1 = date_create(date('Y-m-d',strtotime('wednesday')));
    $datetime2 = date_create(date('Y-m-d',strtotime('saturday')));
    
    $interval = date_diff($datetime1, $datetime2);
    
    echo $interval->format('%d'); // For days
    

    将返回“3”,但取决于您运行它的时间。

    【讨论】:

    • 我想我一定有点不满,因为几个小时前我的正确答案被否决了。我很抱歉,但我必须否决这个答案,因为它没有提供正确的结果。 3v4l.org/BO44o
    【解决方案3】:

    您可以在新的 DateTime 类中编写用于解析的日期名称:

    <?php
      $datetime1 = new DateTime('Sunday');
      $datetime2 = new DateTime('Wednesday');
      $interval = $datetime1->diff($datetime2);
      echo $interval->format('%R%a days');
      ?>
    

    也低于单行版本:

    echo (new DateTime('Sunday'))->diff(new DateTime('Wednesday'))->format('%a days');
    

    【讨论】:

    • 抱歉,在几个小时前对我的正确答案投了反对票后,我一定有点不满。这个答案没有提供预期的结果。 3v4l.org/lhVOu
    猜你喜欢
    • 2019-10-16
    • 2016-01-05
    • 2021-08-24
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    相关资源
    最近更新 更多