2012-10-10 45 views
-1

如何將isClean設置爲自動刪除時間:00:00:00。所以如果沒有設置時間或午夜,那麼不顯示任何東西。php從自定義日期時間格式化中刪除時間

/** 
* Perform datetime formatting operations. 
* - relative: if today/yesterday 
* - clean: remove time if 00:00 
* 
* @param string $var 
* @param string||array $params 
* @return string 
*/ 
protected function datetime($var,$params) { 
    date_default_timezone_set("Europe/London"); 
    // 1970-01-01 00:00:00 
    $template = $params; 
    $isRelative = false; 
    $isClean = false; 
    if (is_array($params) && !empty($params['template'])) { 
     if (!empty($params['relative']) && trim(strtolower($params['relative'])) == 'yes') { 
      $isRelative = true; 
     } 
     if (!empty($params['clean']) && trim(strtolower($params['clean'])) == 'yes') { 
      $isClean = true; 
     } 
     $template = $params['template']; 
    } 

    // check if its empty or not? 
    if(strlen($var)<1) return $var; 

    // ignore invalue request throw error? 
    if(is_array($template)) return $var; 

    if($var == "NOW") $var = date("d-m-Y H:i:s"); 

    $out = $var; 
    if(strpos($out,":") === false) { 
     $out = trim($out); 
     $out .= " 00:00:00"; 
    } 

    if(($timestamp = $this->getTimestamp($out)) !== false) { 
     if ($isRelative) { 
      $time = date('H:i', $timestamp); 
      if (date('Ymd') == date('Ymd', $timestamp)) { 
       // Today 
       return sprintf("Today at %s", $time); 
      } else { 
       // Yesterday? 
       $today = strtotime("12:00:00"); 
       $yesterday = strtotime('-1 day', $today); 

       if (abs($yesterday - $timestamp) < 12*3600) { 
        return sprintf("Yesterday at %s", $time); 
       } 
      } 
     } 

     $var = date($template,$timestamp); 
    } 

    return $var; 
} 

更多信息:我們的CMS的工作原理是閱讀<match>,並自動匹配這對數據庫列名或我們手動寫<format>long_datetime</format>

所以這種方法的主要原因是:

  1. 連接使用PHP的日期時間的XML選項。
  2. 添加額外的功能,比如現在,相對日期,現在清理日期時間的能力,如果設置爲0
+0

使用datetime對象就能解決了很多的頭痛 –

+0

太多的代碼,這樣一個簡單的任務..... – Baba

+0

另外,我不是100%地理解這個功能的目的。預期的投入和產出是什麼? –

回答

1

您的要求是不明確的,但與澄清$varto automatically remove the time相信,這將有助於

$xml = ' 
<patterns> 
     <pattern> 
    <match>date</match> 
    <datetime>d/m/Y</datetime> 
</pattern> 

<pattern> 
    <match>datetime</match> 
    <datetime>d/m/Y H:i</datetime> 
</pattern> 

<pattern> 
    <match>datetime_nice</match> 
    <datetime>jS F Y, H:i</datetime> 
</pattern> 

<pattern> 
    <match>datetime_iso</match> 
    <datetime>c</datetime> 
</pattern> 

<pattern> 
    <match>datetime_relative</match> 
    <datetime> 
     <relative>YES</relative> 
     <clean>yes</clean> 
     <template>jS M y, H:i</template> 
    </datetime> 
</pattern> 

<pattern> 
    <match>date_relative</match> 
    <datetime> 
     <relative>yes</relative> 
     <template>jS M, Y</template> 
    </datetime> 
</pattern> 

<pattern> 
    <match>long_datetime</match> 
    <datetime> 
     <relative>YES</relative> 
     <template>jS M Y \a\t H:i</template> 
    </datetime> 
</pattern> 
</patterns>  
'; 

echo simpleDateTime("long_datetime",$xml); 

輸出

Yesterday at 11th Oct 12 
          ^--- Date was cleaned instead of H:i in the template 

傅nction使用

function simpleDateTime($var, $xml) { 
    $list = getList($xml); 
    $list = $list[$var]; 
    $date = new DateTime("now", new DateTimeZone("Europe/London")); 
    $output = $date->format($list['template']); 
    if ($list['clean'] === true) { 
     $date->setTime(0, 0, 0); 
     $output = str_replace("00:00", "", $date->format($list['template'])); 
    } 
    $output = trim($output); 
    $output = rtrim($output, ","); 
    if ($list['reletive'] === false) { 
     return sprintf("Today at %s", $output); 
    } else { 
     $date->modify("+1 day"); 
     return sprintf("Yesterday at %s", $output); 
    } 
} 

function getList($xml) { 
    $xml = new SimpleXMLElement($xml); 
    $list = array(); 
    foreach ($xml->children() as $pattern) { 
     $item = array(); 
     $item['reletive'] = false; 
     $item['clean'] = false; 

     if (isset($pattern->datetime->template)) { 
      $item['reletive'] = (strtoupper($pattern->datetime->relative) == "YES") ? true : false; 
      $item['clean'] = (strtoupper($pattern->datetime->clean) == "YES") ? true : false; 
      $item['template'] = (string) $pattern->datetime->template; 
     } else { 
      $item['template'] = (string) $pattern->datetime; 
     } 

     $list[(string) $pattern->match] = $item; 
    } 
    return $list; 
} 
+0

謝謝,但這不是我正在尋找什麼,或者像現在它是如何工作。我會嘗試將XML移除到一個簡單的數組中,也許這是令人困惑的部分,並顯示輸出示例,以便您可以更好地理解。 –

+1

讓我知道,當你有例子和輸出... @John Magnolia – Baba

+0

剛剛更新了額外的調試數據的答案,希望這可以幫助 –