Генерация расписания, которое работает на разных часовых поясах и летнее время - PullRequest
2 голосов
/ 21 марта 2011

Я создаю веб-приложение, которое обучает людей повышаться раньше, оно генерирует график повышения для пользователя в течение семидесятидневного периода. Они вводят свое текущее время нарастания и целевое время нарастания. Затем время нарастания еженедельно уменьшает установленную величину, пока не достигнет целевого времени. Пользователь должен войти на сайт и зарегистрироваться в назначенное время.

Я немного растерялся из-за того, как я сгенерировал этот план с учетом часового пояса и летнего времени текущего пользователя, вошедшего в систему.

Мой начальный часовой пояс - «нейтральный» 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

Я планирую хранить эти сгенерированные временные метки в моей базе данных и конвертировать их на лету в зависимости от установленного пользователем часового пояса. Однако возникает проблема, когда я беру эти динамически сгенерированные временные метки и отображаю их в области, где работает летнее время, вот результат для Европы / Белфаста

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 вступит в силу 27 марта, мое расписание будет на час опережать. Это неправильный способ создать этот график? Как создать расписание, которое уменьшается на определенную величину каждую неделю даже по летнему времени и может быть достаточно гибким, чтобы его можно было преобразовать в другой часовой пояс, если пользователь неожиданно перемещает страну в течение графика.

Любые указатели будут с благодарностью.

1 Ответ

2 голосов
/ 21 марта 2011

Вы можете проверить date('I',$timestamp), который возвращает 1, если время DST, и 0, если нет, и выполнить некоторые математические операции, если это так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...