我目前正在开发一个在线订阅应用程序。我在用户选择订阅天数然后选择开始日期的部分遇到了一些挑战。然后 PHP 应用程序应该能够计算不包括周末的结束日期。
<form method="post">
<input name="startdate" type="text" />
<input name="numberofdays" type="text" />
</form>
有人可以帮我吗?
取决于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";
?>
相同的结果,更短的版本:
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"));
}
我今天开发了一个新功能,可以帮助遇到此类问题的人。
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));
}
我今天开发了一个新功能,可以帮助遇到此类问题的人。取决于 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' ); ?>