2012-10-10 48 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

刚刚更新了额外的调试数据的答案,希望这可以帮助 –