2012-09-05 43 views
0

我正在放在一起每週查看日曆,但我有問題時,到10月28日,這是時鐘前進。日曆跳過一天BST造成與日曆日期的噩夢

到目前爲止我的代碼...

//get viewed date from form and add either a week to it or take a week away 
     if(isset($_POST['add_week'])){ 
       $last_week_ts = strtotime($_POST['last_week']); 
       $display_week_ts = $last_week_ts + (3600 * 24 * 7); 
     } else if (isset($_POST['back_week'])) { 
       $last_week_ts = strtotime($_POST['last_week']); 
       $display_week_ts = $last_week_ts - (3600 * 24 * 7); 
     } else { 
       //sets the current day as the first day of the week so no good 
       /*$display_week_ts = floor(time()/(3600 * 24)) * 3600 * 24;*/ 

       //Does't account for british summer time so days are out after 28th October 
       $display_week_ts = strtotime("Monday noon"); 
     } 

       $week_start = new DateTime(date("Y-m-d", $display_week_ts)); 

      for ($i = 0; $i < 7; $i++) 
     { 
      echo '<td class="day">'; 
      $current_day_ts = $display_week_ts + ($i * 3600 *24); 
      $daily_date = date('d-m-Y', $current_day_ts); 
      $StartDate = date('d', $current_day_ts); 
      $MonthName = date('m', $current_day_ts); 
      $Year = date('Y', $current_day_ts); 
          echo $daily_date; 
          echo '</td>'; 
     } 

$ week_start包含星期視圖中當前日曆開始的值。第一次打開本週時顯示。如果下一週按鈕被按下,一星期將被添加到$ week_start值。目前保存在表格中的隱藏字段中,並在提交後重新發布。我也曾嘗試存儲$ week_start作爲TIMEDATE()對象保存在session

 $week_start = new DateTime(date("Y-m-d", $display_week_ts)); 
     $S_SESSION['week_start'] = $week_start; 

但是當我嘗試打電話給會議回來,並使用動動一個星期前

 $week_start = $S_SESSION['week_start']; 
     $week_start->modify('+1 week'); 

我得到的錯誤'警告:DateTime :: modify()[datetime.modify]:DateTime對象未被其構造函數正確初始化。在做了一些挖掘之後,我發現DateTime似乎不支持5.3之前的會話,而我正在使用5.2.17

如果有人可以幫助我鍛鍊變量$ week_start成爲由$ display_week_ts表示的第一天以BST不會導致問題的方式表示。我一直在

回答

1

使用date_default_timezone_set('UTC');

$week_start->setTimezone(new DateTimeZone('UTC'));

+0

完美的是,所有這些日子以及我玩過的所有代碼,我需要做的就是在頁面頂部添加一行代碼。我很感激你,這是開始做我的頭,謝謝你! – tatty27

0

工作紮實這3天這就是問題所在:

$display_week_ts = $last_week_ts + (3600 * 24 * 7); 

既然你通過DST的變化去,一個星期是不是 3600 * 24 * 7秒前,它實際上是3600 * 24 * 7 - 3600.你從DST班次中失去了一個小時,所以你實際上在8天前跳。同樣的情況也適用於你上週的計算 - 它會失去一個小時,並且只會返回6天。

對於這些類型的計算是安全的,您應該使用DateTime對象和適當的DateIntervals進行這些類型的計算。它會考慮到您的DST變化。

例如

$now = new DateTime(); 
$now->setTimeZone(new DateTimeZone('Whatever/Wherever')); 

$oneweek = new DateInterval('P7D'); 
$nextweek = $now->add($oneweek); 
$lastweek = $now->sub($oneweek); 
+0

非常感謝。如果我可以將兩個答案都標記爲正確的話,我會這樣做,但不幸的是,另一個人首先回答並且工作。但還是謝謝你 – tatty27