【问题标题】:DatePeriod recursive on non-valid month datesDatePeriod 在无效的月份日期上递归
【发布时间】:2017-11-29 10:16:12
【问题描述】:

我正在使用 DatePeriod 来获取循环计费系统的循环日期列表。

代码示例:

$time = new DateTime(date('Y-m-d', 1496185200));
$interval = new DateInterval('P1M');
$occ = 3;
$period = new DatePeriod($time, $interval, $occ);

foreach($period as $d)
{
    echo $d->format('d/m/Y H:i').'<br>';
}

输出:

31/05/2017 00:00
01/07/2017 00:00
01/08/2017 00:00
01/09/2017 00:00

如果交易是在 5 月 31 日购买的,则 DatePeriod 方法将迭代到 7 月 1 日作为下一个有效日期(不是 6 月 31 日),但是,我需要持续日期返回到 8 月 31 日等等

所以输出将是:

31/05/2017 00:00 (June payment)
01/07/2017 00:00 (July payment)
31/07/2017 00:00 (August payment)
31/08/2017 00:00 (September payment)
01/10/2017 00:00 (October payment)
31/10/2017 00:00 (November payment)
01/12/2017 00:00 (December payment)
31/12/2017 00:00 (January payment)

我正在努力计算如何确保付款日期是下一个有效日期。如果日期无效,则无法在预定日期之前进行付款,类似于直接借记。

【问题讨论】:

  • 如果你一直使用当月的最后一天会容易很多,而不是像 如果一个月有 31 天就使用最后一天,否则使用第一天下个月的.

标签: php date recursion subscription


【解决方案1】:

这不是一个非常优雅的解决方案,但下面提供了正确的输出:

    $time = 1490914800;

    $day = date('j', $time);
    $month = date('n', $time);
    $year = date('Y', $time);

    $i = 1;
    while($i < 12)
    {
        if($month == 12)
        {
            $month = 1;
            $year++;
        }else{
            $month++;
        }

        $useDay = $day;

        if(!checkdate($month, $day, $year)) $useDay = date('t', mktime(0, 0, 0, $month, 1, $year));

        $time = mktime(0, 0, 0, $month, $useDay, $year);

        echo date('d/m/Y', $time).'<bR>';
        $i++;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-07
    • 2021-11-06
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多