2015-11-06 171 views
-1

所以,我有這樣的要求:更好的代碼結構?

給定的日期($dateissued)是一個字符串,通常DD.MM.YYYY,但它也可能是MM.YYYY甚至只是YYYY。在後一種情況下,我應該把它作爲一個間隔來處理,比如2005年11月的「2005年11月全部」。要做到這一點,我輸出到$startdate,如果它是一個區間,$enddate設置(否則返回空)。輸出進入JSON,所以格式化很好。

  • 如果給定日期是XX.XX.XXXX,解析爲DD.MM.YYYY
  • 如果給定日期是XX.XXXX,解析爲01.MM.YYYY,並設定結束日期,以LL.MM. YYYY,其中LL是本月的最後一天
  • 如果給定日期是XXXX,解析爲01.01.YYYY,並設定結束日期,以31.12.YYYY

    $dateissued = get_sub_field('w_pub_dateissued'); // get Date String from field 
        $parsedstartdate = date_create_from_format('d.m.Y', $dateissued); 
        $startdate = ''; 
        $enddate = ''; 
        if ($parsedstartdate == false) { // date_create_from_format() returns false if it fails 
         $parsedstartdate = date_create_from_format('d.m.Y', '01.'.$dateissued); // try again as 01.MM.YYYY 
         if ($parsedstartdate == false) { 
          $parsedstartdate = date_create_from_format('d.m.Y', '01.01.'.$dateissued); // try again as 01.01.YYYY 
          if ($parsedstartdate == false) { 
           // bad date; nothing todo, $startdate is empty by default 
          } else { 
           // Full Year 
           $startdate = $parsedstartdate->format('d.m.Y'); 
           $parsedenddate = clone $parsedstartdate; 
           $parsedenddate->add(new DateInterval('P1Y'))->sub(new DateInterval('P1D')); 
           $enddate = $parsedenddate->format('d.m.Y'); 
          } 
         } else { 
          // Full Month 
          $startdate = $parsedstartdate->format('d.m.Y'); 
          $parsedenddate = clone $parsedstartdate; 
          $parsedenddate->add(new DateInterval('P1M'))->sub(new DateInterval('P1D')); 
          $enddate = $parsedenddate->format('d.m.Y'); 
         } 
        } else { 
         $startdate = $parsedstartdate->format('d.m.Y'); 
        } 
        return compact('startdate', 'enddate'); 
    

我使用此代碼異議:

  • 重複
  • 嵌套if-循環
  • 通常難以把握邏輯

所以,親愛的社區 - 我怎麼能做得更好?你會怎麼做?

+6

我投票關閉這一問題作爲題外話,因爲在代碼審查 – ElefantPhace

+0

@ElefantPhace屬於可我們只是將其轉移到代碼審查? – Martin

+0

@馬丁MODS或高聲望的人就可以了,而不是我們。這將被放入隊伍中,以便進行遷移,不出汗。 –

回答

1

我認爲我們可以做這樣的事情......

<?php 
function get_date_interval($thisdate){ 
    /* I don't have the function you do so here we are receiving date as parameter */ 
    $dateissued = $thisdate; 
    $return=false; 
    if($parsedstartdate=date_create_from_format('d.m.Y',substr('01.01.'.$dateissued,-10))){ 
     switch (strlen($dateissued)){ 
      case 4: 
       $interval = 'P1Y'; 
       break; 
      case 7: 
       $interval = 'P1M';  
       break; 
      case 10:  
       $interval = 'P1D'; 
       break; 
      default: 
       return $return; 
     }   
     $startdate = $parsedstartdate->format('d.m.Y'); 
     $parsedenddate = clone $parsedstartdate; 
     $parsedenddate->add(new DateInterval($interval))->sub(new DateInterval('P1D')); 
     $enddate = $parsedenddate->format('d.m.Y'); 
     $return = compact('startdate', 'enddate'); 
    } 
    return $return; 
} 

測試...

echo "<pre>"; 
print_r(get_date_interval('2015')); 
print_r(get_date_interval('11.2015')); 
print_r(get_date_interval('06.11.2015')) ; 
print_r(get_date_interval('invalid')) ; 
print_r(get_date_interval('15')) ; 
print_r(get_date_interval(NULL)) ; 
echo "</pre>"; 

我已經intentionaly改變了你的天賦我的味道時的範圍是一天我做了啓動這兩個具有相同日期和結束日期...所以輸出會是:

Array 
(
    [startdate] => 01.01.2015 
    [enddate] => 31.12.2015 
) 
Array 
(
    [startdate] => 01.11.2015 
    [enddate] => 30.11.2015 
) 
Array 
(
    [startdate] => 06.11.2015 
    [enddate] => 06.11.2015 
) 

但如果這小鬼作用於現有的邏輯/流程,我們只需要另外,如果讓它= false