首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成跨不同时区和DST工作的计划

生成跨不同时区和DST工作的计划
EN

Stack Overflow用户
提问于 2011-03-21 16:26:32
回答 1查看 528关注 0票数 2

我正在构建一个网络应用程序,指导人们早起,它会为用户生成一个超过70天的上升时间表。他们输入当前的上升时间和目标上升时间。然后,上升时间每周递减一个设置量,直到达到目标时间。用户必须在预定的时间登录网站并“签到”。

考虑到当前登录用户的时区和DST,我对如何生成此计划感到有点困惑。

我的起始时区是“中立”的UTC,以下是生成计划的代码(相当冗长,但我仍处于实验阶段)。

代码语言:javascript
复制
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/>";
}

这给出了所需的输出:

代码语言:javascript
复制
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正在运行的区域中时,出现了一个问题,以下是Europe/Belfast的输出

代码语言:javascript
复制
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

随着DST于3月27日开始运行,我的计划提前了一个小时。这是生成此计划的错误方式吗?如何创建一个即使在DST上也每周减少一定数量的计划,并且如果用户在计划过程中突然改变国家,则可以灵活地转换为另一个时区。

如果有任何建议,我们将非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-21 17:10:57

您可以检查date('I',$timestamp),如果时间是DST,则返回1,如果不是,则返回0,如果是,则执行一些数学运算。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5375289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档