2014-12-03 49 views
0

我有在PHP中日期的減法痘痘問題,這裏是我試過的許多代碼之一:減法在PHP中的日期不工作

date_default_timezone_set('Europe/Paris'); 
$log_end = new DateTime(); // date from which I want to substract a period 
$log_begin = $log_end->sub(new DateInterval('PT0H1M2S')); //I substract the period to the date to find the when the log begins. 
$log_b = $log_begin->format("Y-m-d H:i:s"); 
$log_e = $log_end->format("Y-m-d H:i:s"); 
print_r($log_b); 
print_r("\n"); 
print_r($log_e); 

這裏是打印的內容:

2014-12-03 21:50:41 
2014-12-03 21:50:41 

正如你所看到的,日期是一樣的,不管我用什麼方法,結果都是一樣的。 所以我在某個地方犯了一個錯誤,或者我想做的事情是不可能的?

預先感謝您花時間幫助我並回答我,讓我知道您是否需要信息。

回答

1
$log_begin = $log_end->sub(new DateInterval('PT0H1M2S')); 

減去$log_end的dateinterval(所以$log_end現在2014-12-03 21:50:41回報與存儲在$ log_begin

爲了防止$log_end來自同一(2014-12-03 21:50:41)值的新DateTime對象將其克隆到$log_begin,然後從$log_begin減去期間

date_default_timezone_set('Europe/Paris'); 
$log_end = new DateTime(); // date from which I want to substract a period 
$log_begin = clone $log_end; 
$log_begin->sub(new DateInterval('PT0H1M2S')); //I substract the period to the date to find the when the log begins. 
$log_b = $log_begin->format("Y-m-d H:i:s"); 
$log_e = $log_end->format("Y-m-d H:i:s"); 
print_r($log_b); 
print_r("\n"); 
print_r($log_e); 
+0

它完美的作品,謝謝你幫助我,並感謝你今天教我的東西。 – 2014-12-03 21:13:39

1

我創建了一個PHP類來處理日期,如減去或添加日(和/或月和/或年)。那是你需要的嗎?檢查它:

class Dates 
{ 

    public function __construct() {} 

    public function add_date($_date, $_years, $_months, $_days, $_spacer, $_leading_zeros = 1) { 

     $values = explode($_spacer, $_date); 

     for($i = 0;$i < 3;$i++) {$values[$i] = round($values[$i]);} 

     $values[2] += $_days; 

     if($values[2] > 31) { 
      $aux = floor($values[2]/31); 
      while($values[2] > 31) {$values[2] -= 31;} 
      $values[1] += $aux; 
     } 

     $values[1] += $_months; 
     $values[0] += $_years; 

     if($values[1] > 12) { 
      $aux = floor($values[1]/12); 
      while($values[1] > 12) {$values[1] -= 12;} 
      $values[0] += $aux; 
     } 

     $leapYear = (($values[0] % 4 == 0) && (($values[0] % 100 != 0) || ($values[0] % 400 == 0))) ? 29 : 28; 
     $days = Array(0, 31, $leapYear, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); 

     if($values[2] > $days[$values[1]]) { 
      $values[2] -= $days[$values[1]]; 
      $values[1]++; 
     } 

     if($_leading_zeros) {return leading_zeros($values[0].$_spacer.$values[1].$_spacer.$values[2], $_spacer);} 
     else {return $values[0].$_spacer.$values[1].$_spacer.$values[2];} 

    } 

    public function subtract_date($_date, $_years, $_months, $_days, $_spacer, $_leading_zeros = 1) { 

     $values=explode($_spacer, $_date); 

     for($i = 0;$i < 3;$i++){$values[$i] = round($values[$i]);} 

     $days = Array(0, 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); 

     $values[0] -= $_years; 
     $values[1] -= $_months; 

     while($values[1] < 1) { 
      $values[1] += 12; 
      $values[0]--; 
     } 

     $values[2] -= $_days; 

     while($values[2] < 1) {  
      $values[1]--; 
      if($values[1] == 0) { 
       $values[1] = 12; 
       $values[0]--; 
      } 
      if($values[1] == 2) {$days[2] = (($values[0] % 4 == 0) && (($values[0] % 100 != 0) || ($values[0] % 400 == 0))) ? 29 : 28;} 
      $values[2] += $days[$values[1]]; 
     } 

     if($_leading_zeros) {return leading_zeros($values[0].$_spacer.$values[1].$_spacer.$values[2], $_spacer);} 
     else {return $values[0].$_spacer.$values[1].$_spacer.$values[2];} 
    } 

    public function leading_zeros($_date, $_spacer) { 

     $_date = $_spacer.$_date.$_spacer; 

     for($i = 1;$i < 10;$i++) { 
      while(strstr($_date, $_spacer.$i.$_spacer)){$_date = str_replace($_spacer.$i.$_spacer, $_spacer.'0'.$i.$_spacer, $_date);} 
     } 

     $_date = substr($_date, 1); 
     $_date = substr($_date, 0, -1); 

     return $_date; 

    } 

} 
+0

不是真的,因爲我也想減去小時,分鐘和秒(我沒有在我的帖子中說過,我很抱歉)。但是,仍然,謝謝,我會看看,並保持你的代碼以防萬一,我想添加這些東西。 – 2014-12-03 21:12:34

+0

核心PHP開發人員還在覈心PHP中創建了一個DateTime處理類,它更高效,更靈活,更準確 – 2014-12-03 21:13:11

+0

實際上,這個類已經擴展來處理時間了,但是我看着我GIT,顯然我沒有轉貼。是的,有一些很好的發展來處理日期和時間。 – Verhaeren 2014-12-03 21:15:12