【问题标题】:Count next X days without Sunday using Laravel carbon使用 Laravel carbon 计算接下来的 X 天没有星期天
【发布时间】:2020-09-30 23:13:12
【问题描述】:

我正在使用 Laravel 开发一个基于订阅的应用程序。我想在订阅包 75 天后将用户的状态更改为 expire。我想从这 75 天中排除星期日。

假设用户的帐户今天已通过验证,并且他只能在 75 天内(不包括星期日)访问高级功能。 75 天后,用户需要重新订阅才能访问应用程序的高级功能。

然后我将设置一个中间件来检查用户的订阅是否过期。

我有两种情况要检查是否过期:

  1. 将到期日期列保存在users 表中。
  2. 根据verified_at(日期时间)列验证每个用户的请求,并在用户订阅超过 75 天(不含星期日)时阻止高级访问。

我想使用Laravel Carbon 或任何其他替代库/功能来实现此目的。

从今天(6 月 11 日)起 75 天后是 8 月 25 日????‍♂️
从今天(6 月 11 日 - 不包括星期日)起 75 天后是 9 月 7 日????

参考:https://getcalc.com/75business-days-after-today.htm

【问题讨论】:

  • 关于我的回答的消息?
  • @Berto99 感谢您的回答和解释,我在使用您提供的解决方案时发现了一些问题。考虑一下,我今天在 6 月 12 日星期五创建了一个帐户,即第 5 天,那么$period_in_days 将是 86,如果我在星期五之后的 86 天之后得到日期是 9 月 6 日,而如果我从星期五得到 75 天,不包括星期日,我将在 9 月 8 日获得。我已经使用 getcalc.com/75business-days-after-today.htm 进行了验证,请参阅我的答案,我如何解决这个问题

标签: laravel validation datetime php-carbon


【解决方案1】:

如果75 是固定的,那么您可以轻松计算出该期间的星期日数,因此您只需将这些天数添加到75

$period_in_days = 75;
if($user->verified_at->dayOfWeek > 2)
    $period_in_days += 11;
else 
    $period_in_days += 10;

关键是,在 75 天中可能有 10 或 11 个星期日,因此为了确定是 10 还是 11,我们需要检查哪一天是第一天。
假设是星期一的第一天,那么 75 天应该是这样的

1 - Monday
2 - Tuesday
...
71 - Monday
72 - Tuesday
73 - Wednesday
74 - Thursday
75 - Friday

假设是星期二的第一天,那么 75 天应该是这样的

1 - Tuesday
2 - Wednesday
...
71 - Tuesday
72 - Wednesday
73 - Thursday
74 - Friday
75 - Saturday

假设是星期三的第一天,那么 75 天应该是这样的

1 - Wednesday
2 - Thursday
...
71 - Wednesday
72 - Thursday
73 - Friday
74 - Saturday
75 - Sunday

所以如果第一天既不是Monday也不是Tuesday,那么就会有11星期日(10+[71-75]中出现的1),否则只有10个星期日

【讨论】:

  • 您介意再解释一下吗。此外,从今天起 86 天和 85 天后的确切日期并未显示为从现在起 75 天后的确切日期,不包括星期日。
  • @Muhaddis 请检查答案
【解决方案2】:

我可以使用以下 PHP 函数计算接下来的 75 天(不包括星期日)

function Next75Days($StartingDate){
        // Count Next 75 Days excluding Sundays
        $Days = 75;

        $d = new DateTime($StartingDate);
        $t = $d->getTimestamp();

        // Loop for 75 days
        for($i=0; $i<$Days; $i++){

            // Add 1 day to timestamp
            $addDay = 86400;

            // Get date of next day
            $nextDay = date('w', ($t+$addDay));

            // if it's Sunday, do $i--1
            if($nextDay == 0) {
                $i--;
            }

            // modify timestamp, add 1 day
            $t = $t+$addDay;
        }

        $d->setTimestamp($t);

        return $d->format('d M Y');

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-25
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 2012-01-28
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多