2015-11-06 110 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