BST造成日历日期的噩梦

时间:2012-09-05 14:16:20

标签: php

我正在整理一个每周视图日历,但是在到达10月28日这是时钟前进的时候我遇到了问题。日历会跳过一天

我的代码到目前为止......

//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()对象

        $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');

我收到错误'Warning:DateTime :: modify()[datetime.modify]:DateTime对象尚未被其构造函数'正确初始化'。在做了一些挖掘后,我发现DateTime似乎不支持会话直到5.3并且我使用的是5.2.17

如果有人可以帮助我锻炼变量$ week_start成为$ display_week_ts代表的一周中的第一天,以便BST不会导致问题,我将非常感激。我现在已经坚持了3天了

2 个答案:

答案 0 :(得分:1)

使用date_default_timezone_set('UTC');

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

答案 1 :(得分:0)

这是问题所在:

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

由于您正在进行DST更改,因此一周 3600 * 24 * 7秒,实际上是3600 * 24 * 7 - 3600.您将失去一小时夏令时转移,所以你实际上已经超过了8天。对于你上一周的计算也是如此 - 它会失去一个小时而且只能回到6天。

为了使这些类型的计算安全,您应该使用DateTime对象,并为这些类型的计算使用适当的DateIntervals。它会将DST更改考虑在内。

e.g。

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

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