[英]How should I write this specific condition in php?
挑战是:
我的代码是:
<?php
$expectedDay = "6";
$expectedMonth = "6";
$expectedYear = "2015";
$returnDay = "9";
$returnMonth = "6";
$returnYear = "2015";
if ($expectedDay >= $returnDay && $expectedMonth >= $returnMonth && $expectedYear >= $returnYear) {
echo "Fine = 0";
}elseif ($expectedDay < $returnDay && $expectedMonth == $returnMonth && $expectedYear == $returnYear) {
$fine = 15 * ($returnDay-$expectedDay);
echo "Fine = ".$fine;
}elseif (($expectedDay <= $returnDay || $expectedDay >= $returnDay) && $expectedMonth < $returnMonth && $expectedYear == $returnYear) {
$fine = 500 * ($returnMonth-$expectedMonth);
echo "Fine = ".$fine;
}else{
echo "Fine = 1000";
}
?>
它运行良好,但在输入以下内容时失败:
$expectedDay = "28";
$expectedMonth = "2";
$expectedYear = "2015";
$returnDay = "15";
$returnMonth = "4";
$returnYear = "2015";
我如何写这种情况? 提前致谢。
注意:这不是业务逻辑,仅是实践目的,我是PHP初学者。
遵循以下原则:
function calculateLateFees(DateTime $deadline, DateTime $returned) {
if ($returned <= $deadline) {
return 0;
}
if ($returned->format('Y') > $deadline->format('Y')) {
return 10000;
}
if ($returned->format('n') > $deadline->format('n')) {
return ($returned->format('n') - $deadline->format('n')) * 500;
}
return $deadline->diff($returned)->days * 15;
}
$deadline = new DateTime('2015-02-28');
$returned = new DateTime('2015-04-15');
echo calculateLateFees($deadline, $returned), ' Hackos';
选中月份条件后,您不必比较日期。
<?php
$expectedDay = "6";
$expectedMonth = "6";
$expectedYear = "2015";
$returnDay = "9";
$returnMonth = "6";
$returnYear = "2015";
$returnDate = new DateTime($returnDay.'-'.$returnMonth.'-'.$returnYear);
$expectedDate = new DateTime($expectedDay.'-'.$expectedMonth.'-'.$expectedYear);
if ($returnDate <= $expectedDate) {
echo "Fine = 0";
}elseif ($expectedDay < $returnDay && $expectedMonth == $returnMonth && $expectedYear == $returnYear) {
$fine = 15 * ($returnDay-$expectedDay);
echo "Fine = ".$fine;
}elseif ($expectedMonth < $returnMonth && $expectedYear == $returnYear) {
$fine = 500 * ($returnMonth-$expectedMonth);
echo "Fine = ".$fine;
}else{
echo "Fine = 1000";
}
?>
试试看
首先,我必须说,这是非常不公平的罚款计算。 如果预计的日期是2016年12月31日,并且该书已于2017年1月1日退还怎么办? 根据您的方法,一天的罚款将被罚款10000,仅因为它跨越了两年的间隔。
我建议您根据延迟天数来计算罚款。
$lateDays = date_diff($expectedDate, $returnDate, false);
if ($lateDays > 0) {
if ($lateDays < 30)
$fine = 15 * $lateDays
else
if ($lateDays > 365)
$fine = 10000
else
$fine = 500 * $lateDays / 30
}
if($returnYear > $expectedYear){
$fine = 1000;
}
else{
if($returnMonth > $expectedMonth ){
$fine = 500 * ($returnMonth-$expectedMonth);
}
else{
if($returnDay>$expectedDay){
$fine = $returnDay - $expectedDay;
}
else{
$fine = 0;
}
}
}
echo $fine;
上面的逻辑是考虑到跨月使用完整的月份成本示例而考虑的:
如果预期的返回日期是28/04/2016,而实际的返回日期是02/05/2016,则由于更改了月份,因此以下算法会使用@complete month。
如果您希望在计算月/年时考虑确切的天数差异,那么我们可以一起编写不同的逻辑
第一个php代码,请不要多投票:)
<?php
$expectedDay = "6";
$expectedMonth = "6";
$expectedYear = "2015";
$returnDay = "9";
$returnMonth = "6";
$returnYear = "2015";
$expectedate=$expectedYear.'-'.$expectedMonth.'-'.$expectedDay;
$returndate=$returnYear.'-'.$returnMonth.'-'.$returnDay;
$expected=date_create($expectedate);
$return=date_create($returndate);
$interval=date_diff($expected, $return);
$valor=$interval->format('%R%a');
if ($valor>0) {
if ($returnMonth==$expectedMonth && $returnYear==$expectedYear) echo "Fine=".(15*$valor);
if ($returnMonth!=$expectedMonth && $returnYear==$expectedYear) echo "Fine=".(500*($returnMonth-$expectedMonth));
if ($returnYear!=$expectedYear) echo "Fine=1000";
} else echo "Fine=0";
?>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.