我正在整理一个每周视图日历,但是在到达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天了
答案 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);