我正在构建一个网络应用程序,指导人们早起,它会为用户生成七十天内的起床时间表。他们输入当前的上升时间和目标上升时间。然后,上升时间每周减少一定量,直到达到目标时间。用户必须登录网站并在预定时间“签到”。
考虑到当前登录用户的时区和夏令时,我对如何生成此计划感到有点困惑。
我的起始时区是“中性”UTC,这是生成计划的代码(相当冗长,但我仍处于实验阶段。)
date_default_timezone_set('UTC');
function timeDiff($normRisingTime, $targetRisingTime)
{
$normRisingTime = strtotime($normRisingTime);
$targetRisingTime = strtotime($targetRisingTime);
$timeDiff = $normRisingTime - $targetRisingTime;
return $timeDiff;
}
function dropPerWeek($numSeconds)
{
$incDrop = $numSeconds / 9; //9 out of ten weeks the time will decrement and remain the same in week 10
return $incDrop;
}
$timeDiffSecs = timeDiff("07:00","06:00"); //times for testing purposes
$decrementSecs = dropPerWeek($timeDiffSecs);
$startDate = time();
$dayNum = 1;
for($i = 0; $i < 9; $i++)
{
$weekNum = $i + 1;
for($j = 0; $j < 7; $j++){
$dayTimeStamp = $startDate + 86400 * $j;
$dayTimeStamp = round($dayTimeStamp/60)*60; //round to nearest minute
$dayTot = $j + $dayNum;
if(empty($dayArray)){
$dayArray = array(1=>$dayTimeStamp);
}else{
$dayArray[] = $dayTimeStamp;
}
}
$dayNum = $dayTot + 1;
$startDate = $dayTimeStamp + 86400 - $decrementSecs;
}
for($j = 0; $j < 7; $j++){
$dayTimeStamp = $startDate + 86400 * $j;
$dayTot = $j + $dayNum;
$dayArray[] = $dayTimeStamp;
}
foreach ($dayArray as $key=>$value ) {
echo $key." ".$value." ";
echo strftime('%c', $value)."<br/>";
}
这给出了所需的输出:
1 1300695300 Mon Mar 21 08:15:00 2011
2 1300781700 Tue Mar 22 08:15:00 2011
3 1300868100 Wed Mar 23 08:15:00 2011
4 1300954500 Thu Mar 24 08:15:00 2011
5 1301040900 Fri Mar 25 08:15:00 2011
6 1301127300 Sat Mar 26 08:15:00 2011
7 1301213700 Sun Mar 27 08:15:00 2011
8 1301299680 Mon Mar 28 08:08:00 2011
9 1301386080 Tue Mar 29 08:08:00 2011
10 1301472480 Wed Mar 30 08:08:00 2011
11 1301558880 Thu Mar 31 08:08:00 2011
12 1301645280 Fri Apr 1 08:08:00 2011
我计划将这些生成的时间戳存储在我的数据库中,并根据用户设置的时区即时转换它们。
然而,当我获取这些动态生成的时间戳并将它们显示在 DST 正在运行的区域时,就会出现问题,这是欧洲/贝尔法斯特的输出
1 1300695480 Mon Mar 21 08:18:00 2011
2 1300781880 Tue Mar 22 08:18:00 2011
3 1300868280 Wed Mar 23 08:18:00 2011
4 1300954680 Thu Mar 24 08:18:00 2011
5 1301041080 Fri Mar 25 08:18:00 2011
6 1301127480 Sat Mar 26 08:18:00 2011
7 1301213880 Sun Mar 27 09:18:00 2011 //schedule jumps ahead by an hour because of DST
8 1301299860 Mon Mar 28 09:11:00 2011
9 1301386260 Tue Mar 29 09:11:00 2011
10 1301472660 Wed Mar 30 09:11:00 2011
11 1301559060 Thu Mar 31 09:11:00 2011
12 1301645460 Fri Apr 1 09:11:00 2011
随着夏令时于 3 月 27 日开始实施,我的日程提前了一个小时。这是生成此计划的错误方法吗?如何创建一个时间表,即使在夏令时期间,每周也会减少一定量,并且如果用户在时间表期间突然移动国家/地区,则可以足够灵活地转换为另一个时区。
任何指示将不胜感激。