3

我目前正在开发一个在线订阅应用程序。我在用户选择订阅天数然后选择开始日期的部分遇到了一些挑战。然后 PHP 应用程序应该能够计算不包括周末的结束日期。

<form method="post">
    <input name="startdate" type="text" />
    <input name="numberofdays" type="text" />
</form>

有人可以帮我吗?

4

4 回答 4

17

取决于startdate发送方式,但假设您使用的是 Ymd,您可以使用DateTime

例如:

<?php 

    $_POST['startdate'] = '2012-08-14';
    $_POST['numberofdays'] = 10;

    $d = new DateTime( $_POST['startdate'] );
    $t = $d->getTimestamp();

    // loop for X days
    for($i=0; $i<$_POST['numberofdays']; $i++){

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

        // get what day it is next day
        $nextDay = date('w', ($t+$addDay));

        // if it's Saturday or Sunday get $i-1
        if($nextDay == 0 || $nextDay == 6) {
            $i--;
        }

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

    $d->setTimestamp($t);

    echo $d->format( 'Y-m-d' ). "\n";

?>
于 2012-08-14T18:51:53.443 回答
2

相同的结果,更短的版本:

function addDays($days,$format="Y-m-d"){

    for($i=0;$i<$days;$i++){
        $day = date('N',strtotime("+".($i+1)."day"));
        if($day>5)
            $days++;
    }
    return date($format,strtotime("+$i day"));
}
于 2020-02-07T08:20:14.807 回答
1

我今天开发了一个新功能,可以帮助遇到此类问题的人。

function sumDays($days = 0, $format = 'd/m/Y') {
    $incrementing = $days > 0;
    $days         = abs($days);
    $actualDate   = date('Y-m-d');

    while ($days > 0) {
        $tsDate    = strtotime($actualDate . ' ' . ($incrementing ? '+' : '-') . ' 1 days');
        $actualDate = date('Y-m-d', $tsDate);

        if (date('N', $tsDate) < 6) {
            $days--;
        }
    }

    return date($format, strtotime($actualDate));
}
于 2019-03-26T19:15:46.037 回答
1

我今天开发了一个新功能,可以帮助遇到此类问题的人。取决于 startdate 的发送方式,但假设您使用的是 Ymd,您可以使用 DateTime

<?php  public static function getOrderEndDate( $start_date, $orderDaysCode ){

    $saturday_off = false;
    if( $orderDaysCode == 'meal_monthly_6' ) { $orderDays = 24; }
    elseif( $orderDaysCode == 'meal_monthly_5' ) {
        $orderDays = 20;
        $saturday_off = true;
    }elseif( $orderDaysCode == 'meal_weekly' ) {
        $orderDays = 5;
        $saturday_off = true;
    }
    else{ $orderDays = 1; }   // Daily Meal

    $formatted_date = new DateTime( $start_date );

    $date_timestamp = $formatted_date->getTimestamp();
    // loop for X days
    for( $i = 0; $i < ( $orderDays - 1 ); $i++ ) {
        // get what day it is next day
        $nextDay = date('w', strtotime('+1day', $date_timestamp) );
        // if it's Sunday or Saturday get $i-1
        if( $nextDay == 0 || ( $nextDay == 6 && $saturday_off ) ) { $i--; }
        // modify timestamp, add 1 day
        $date_timestamp = strtotime('+1day', $date_timestamp);
    }

    $formatted_date->setTimestamp($date_timestamp);

    return $formatted_date->format( 'Y-m-d' );
}

$orderEndDate = getOrderEndDate( '2020-06-17', 'meal_monthly_6' ); ?>
于 2020-06-17T07:57:24.483 回答