繁体   English   中英

我应该如何在php中写这个特定条件?

[英]How should I write this specific condition in php?

挑战是:

  • 如果书籍在预期的归还日期或之前归还,则不会收取任何罚款(即:fine = 0)。
  • 如果在预期退货日期之后归还图书,但仍在与预期退货日期相同的日历月和年份内,则罚款= 15 Hackos×(延迟天数)。
  • 如果该书在预期归还月份之后归还,但仍在与预期归还日期相同的日历年内,则罚款= 500 Hackos×(延迟的月数)。
  • 如果在预期的日历年之后归还该书,则将处以10000 Hackos的固定罚款。

我的代码是:

<?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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM